【问题标题】:C function calling C++ member function - where the C code is compiled with a C compilerC 函数调用 C++ 成员函数 - 其中 C 代码使用 C 编译器编译
【发布时间】:2017-04-21 08:24:43
【问题描述】:

在作为骗子关闭之前,阅读问题并了解它为什么不同(提示:它是 C 编译器)

我在 Google 上搜索了很多很多关于 C 函数如何调用 C++ 成员函数的解释。

它们看起来都类似于接受的对this question 的回答,来自一个非常高的代表成员。

上面写着

在头文件中,放

extern "C" void* MyClass_create() {
   return new MyClass;
}
extern "C" void MyClass_release(void* myclass) {
   delete static_cast<MyClass*>(myclass);
}
extern "C" void MyClass_sendCommandToSerialDevice(void* myclass, int cmd, int params, int id) {
   static_cast<MyClass*>(myclass)->sendCommandToSerialDevice(cmd,params,id);
}

并且,在 C 代码中,放入

void* myclass = MyClass_create();
MyClass_sendCommandToSerialDevice(myclass,1,2,3);
MyClass_release(myclass);

这看起来很简单,但我不明白的是,头文件必须引用MyClass(别介意static_cast),但我想用C编译器编译我的C代码( gcc),而不是 C++ 编译器 (g++)。

这行不通。如何从使用 C 编译器编译的 C 代码调用 C++ 成员函数?

【问题讨论】:

  • 另一个答案没有说“在头文件中,放”。它说 “然后在 C++ 中执行函数调用:”。 C 编译器只能处理声明,不能处理函数定义。
  • 只把声明放在头文件中,那些函数的定义需要C++编译器编译。
  • 您链接的问题被标记为另一个问题的副本,其中有一个详细的示例说明应该在标题中放入什么以及在 C++ 定义中放入什么
  • 好的,我没有阅读你所有的问题,抱歉。您可以使用 C 编译器编译 C 代码,但必须使用 C++ 编译器编译 C++ 代码。 C 编译器可以理解void* MyClass_create(); 并调用该函数。如果 C++ 编译器将函数视为 extern "C" void* MyClass_create();,它将使来自 C 的调用工作。
  • 这里的重点是不能用C编译器调用成员函数。也许我应该更清楚一点,您使用可从 C 调用的 C 接口实现了 C++ 函数,并且该实现执行 C++ 调用。请注意,从 C 编译器调用 C++ 成员函数本质上是不可能的,编译器必须解析类并理解它,知道如何调用成员函数......成为 C++ 编译器。

标签: c++ c class extern


【解决方案1】:

您应该在 C++ 中执行以下操作:

在与 C 兼容的头文件中,例如interface.h,写:

#if defined(__cplusplus)
extern "C" {
#endif

void* MyClass_create();
void MyClass_release(void* myclass);
void MyClass_sendCommandToSerialDevice(void* myclass, int cmd, int params, int id);

#if defined(__cplusplus)
}
#endif

在源文件中,例如interface.cpp,放

/*extern "C"*/ void* MyClass_create() {
    return new MyClass;
}
/*extern "C"*/ void MyClass_release(void* myclass) {
    delete static_cast<MyClass*>(myclass);
}
/*extern "C"*/ void MyClass_sendCommandToSerialDevice(void* myclass, int cmd, int params, int id) {
    static_cast<MyClass*>(myclass)->sendCommandToSerialDevice(cmd,params,id);
}

现在,将它们编译为原始 C++ 库的一部分或单独的 C++ 库。您应该能够在纯 C 程序中包含上述 .h 文件并将它们与库链接。

【讨论】:

  • 一个清晰、出色的答案,我已经测试过并且很满意(+1 和答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多