これがプロジェクト開発の良い方法ではないことはわかっていますが、私の仕事のいくつかの理由から、C プロジェクトで C++ のいくつかのデータ構造 (LRU キャッシュとハッシュ マップ) を統合することに取り組んでいます。
これまでのところ、 を使用して C++ で C 関数を呼び出す方法があることはわかっていますが、Cextern "C"
から C++ オブジェクト (メソッド...) を呼び出す場合はどうでしょうか?
私はGCCを使用しています。
すべてのコードが C++ コンパイラでコンパイルされている場合、問題はない (またはほとんどない) はずです。
C を gcc でコンパイルし、C++ を g++ でコンパイルした場合、クラスの周りにヘッダー ラッパーを記述して、一連の関数を介して C++ コードを表示できるようにする必要があります。
例:
MyClass.h
#ifdef __cplusplus
class MyClass
{
public:
MyClass() {/*STUFF*/}
~MyClass() {/*STUFF*/}
int doStuff(int x, float y) {/*STUFF*/}
};
extern "C" {
#endif
/* C Interface to MyClass */
void* createMyClass();
void destroyMyClass(void* mc);
int doStuffMyClass(void* mc, int x, float y);
#ifdef __cplusplus
}
#endif
ソースファイル
MyClass.cpp
#include "MyClass.h"
void* createMyClass() {return reinterpret_cast<void*>(new MyClass);}
void destroyMyClass(void* mc) {delete reinterpret_cast<MyClass*>(mc);}
int doStuffMyClass(void* mc, int x, float y)
{
return reinterpret_cast<MyClass*>(mc)->doStuff(x,y);
}
あなたの C コードは "MyClass.h" だけをインクルードし、提供された C 関数を使用します。
MyCFile.c
#include "MyClass.h"
int main()
{
void* myClass = createMyClass();
int value = doStuffMyClass(myClass, 5, 6.0);
destroyMyClass(myClass);
}
C++ インターフェイスの周りに C ラッパーを記述します。extern "C"
C++ としてコンパイルしますが、C インターフェイスをブロックに含めるようにしてください。この新しいインターフェイスは、C プログラムと正常にリンクし、C++ コードへのアクセスを提供するはずです。
最初のパラメーターとしてオブジェクトへのポインターを取る C 互換の転送関数を作成する必要があります。転送関数は、[通常] 最初のパラメーターを正しいオブジェクト型にキャストし、適切なメンバー関数を呼び出します。
// Function declaration in header
extern "C" void function(void *object, int param1, int param2);
// Function definition in source file
extern "C" function(void *object, int param1, int param2)
{
static_cast<Object*>(object)->member_function(param1, param2);
}