0

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++ コードを混在させるのは初めてで、どちらの言語にも比較的慣れていません。

4

1 に答える 1

0

あなたの例CInterfaceでは、C++に対してのみ定義されています。リンクした例を詳しく見ると、これがFredクラスにも当てはまることがわかります。

Cからは、へのポインタのみを渡すことができ、実際にインスタンスCInterfaceを操作するには、Cリンケージで定義されたC++関数に依存する必要があります。CInterface

structそれ以外の場合は、CとC++の間でデータを渡す手段としてを定義できます。extern "C"その定義がC++から使用される場合と同じように宣言されていることを確認してください。

#ifdef __cplusplus
extern "C" {
#endif

struct CandCPlusPlus {
// ...
};

#ifdef __cplusplus
}
#endif
于 2012-10-02T16:04:36.813 に答える