5

これがプロジェクト開発の良い方法ではないことはわかっていますが、私の仕事のいくつかの理由から、C プロジェクトで C++ のいくつかのデータ構造 (LRU キャッシュとハッシュ マップ) を統合することに取り組んでいます。

これまでのところ、 を使用して C++ で C 関数を呼び出す方法があることはわかっていますが、Cextern "C"から C++ オブジェクト (メソッド...) を呼び出す場合はどうでしょうか?

私はGCCを使用しています。

4

3 に答える 3

6

すべてのコードが 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);
}
于 2013-05-27T17:44:49.440 に答える
6

C++ インターフェイスの周りに C ラッパーを記述します。extern "C"C++ としてコンパイルしますが、C インターフェイスをブロックに含めるようにしてください。この新しいインターフェイスは、C プログラムと正常にリンクし、C++ コードへのアクセスを提供するはずです。

于 2013-05-27T17:29:18.843 に答える
5

最初のパラメーターとしてオブジェクトへのポインターを取る 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);
}
于 2013-05-27T17:31:05.850 に答える