使用C编译器编译的C代码如何调用C++成员函数?

3

在关闭重复问题之前,先阅读问题并看看它为什么不同(提示:是C编译器)

我已经通过谷歌找到了很多关于如何调用C++成员函数的C函数的解释。

它们都类似于这个问题的被接受的答案,来自一个非常高声望的成员。

它说

在头文件中,放置

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 编译器(gcc)编译我的 C 代码,而不是 C++ 编译器(g++)。

这不会起作用。我该如何从 C 代码中调用 C++ 成员函数 - 而它是由 C 编译器编译的?


5
另一个答案没有说“在头文件中放置”,它说“然后在C++中执行函数调用:”。C编译器只能处理声明,而不能处理函数定义。 - Bo Persson
1
只将声明放在头文件中,这些函数的定义需要由C++编译器编译。 - Daniel Jour
3
您提供的链接中的问题被标记为另一个问题的重复,那个问题中有一个详细的示例,解释了应该放入头文件和C++定义的内容。 - UnholySheep
2
好的,我没有读完你的问题,抱歉。你可以使用C编译器编译你的C代码,但是必须使用C++编译器编译C++代码。C编译器可以理解 void* MyClass_create(); 并调用该函数。如果C++编译器将函数看作 extern "C" void* MyClass_create();,它将使来自C的调用起作用。 - Bo Persson
1
这里的关键点是你不能使用C编译器调用成员函数。也许我应该更清楚地表达,你需要使用C接口实现一个C++函数,以便从C中进行调用,而该实现会进行C++调用。请注意,从C编译器调用C++成员函数在本质上是不可能的,编译器必须解析类并理解它,知道如何调用成员函数...也就是说,必须是C++编译器。 - David Rodríguez - dribeas
显示剩余2条评论
1个回答

5

以下是在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 和采纳)。 - Mawg says reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接