C から C++ オブジェクトのメンバー関数を呼び出す方法については、このガイドに従っています。私が理解しているように、C コードはクラスを同じ名前の構造体として解釈する必要があり、関数を呼び出したいときはいつでもこのクラスのオブジェクトを介して、中間コールバック関数を使用する必要があります。ヘッダーは次のようになります。
// CInterface.h
#ifdef __cplusplus
...
class CInterface
{
public:
...
void OnMessage(U8* bytes); // I want to call this function from C.
private:
...
};
#else
typedef
struct CInterface
CInterface;
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__STDC__) || defined(__cplusplus)
//extern void c_function(CInterface*); /* ANSI C prototypes (shouldn't be needed) */
extern CInterface* cpp_callback_function(CInterface* self, unsigned char * bytes);
#else
//extern void c_function(); /* K&R style (shouldn't be needed) */
extern CInterface* cpp_callback_function(unsigned char * bytes);
#endif
#ifdef __cplusplus
}
#endif
現在失敗している C コードは次のようになります。 // main.c #include "CInterface.h"
int main(int argc, char* argv[])
{
void* ptr;
int *i = ptr; // Code that only compiles with a C compiler
CInterface cinterface; // This should declare a struct
}
エラー: エラー C2079: 'cinterface' は未定義の構造体 'CInterface' を使用しています。
構造体が定義されていないため、ヘッダーが c++ コードとして読み取られているように聞こえますが、main.c は Visual Studio に従って C によってコンパイルされています (C 固有のコードを追加してこれを再確認しました)。ただし、次のように括弧を追加すると:
CInterface cinterface();
コードはコンパイルされますが、これは今では C では動作しないオブジェクトであるため、意味がありません。
コールバック関数は、「中間」として機能する 3 番目のファイル CInterface.cpp に実装されています。
したがって、問題は、このエラー メッセージをどのように解決するか、またはアプローチ全体が間違っているかどうかです。C/C++ コードを混在させるのは初めてで、どちらの言語にも比較的慣れていません。