【发布时间】: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++ 编译器。