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 是由 C 根据 Visual Studio 编译的(我还通过添加一些特定于 C 的代码仔细检查了这一点)。但是,如果我添加这样的括号:

CInterface cinterface();

代码编译对我来说毫无意义,因为它现在是一个不应该在 C 中工作的对象。

回调函数在第三个文件 CInterface.cpp 中实现,它充当“中间体”。

所以问题是我如何解决这个错误消息,或者我是否把整个方法弄错了。这是我第一次混合 C/C++ 代码,而且我对这两种语言都比较陌生。

4

1 回答 1

0

在您的示例CInterface中,仅为 C++ 定义。如果您仔细查看链接的示例,您会注意到Fred该类也是如此。

在 C 中,您只能传递指向的指针,CInterface并且您必须依靠使用 C 链接定义的 C++ 函数来实际操作CInterface实例。

否则,您可以将 a 定义struct为在 C 和 C++ 之间传递数据的一种方式。只要确保它的定义被声明为extern "C"从 C++ 使用时:

#ifdef __cplusplus
extern "C" {
#endif

struct CandCPlusPlus {
// ...
};

#ifdef __cplusplus
}
#endif
于 2012-10-02T16:04:36.813 回答