C函数调用C++成员函数 - 在C代码
问题描述:
请收盘为重复数据删除之前编译C编译器,阅读问题&明白为什么它是不同的(提示:这是C编译器)C函数调用C++成员函数 - 在C代码
我有谷歌搜索,并找到许多,很多,如何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编译器(gcc)编译我的C代码,而不是C++编译器(g ++)。
它不起作用。我如何从C代码调用C++成员函数 - 它是用C编译器编译的?
答
您应该在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
文件并将其与库相链接。
+0
一个清晰的,很好的答案,我已经测试和满意的作品(+1和答案)。 – Mawg
其他答案不说*“在头文件中,放*”。它说*“然后在C++中执行函数调用:*”。 C编译器只能处理声明,而不能处理函数定义。 –
只将声明放在头文件中,这些函数的定义需要由C++编译器编译。 –
@BoPersson对不起,但我是一个非常小的大脑Mawg。你能解释一下,好像五岁的孩子吗?当然,C代码迟早会引用一个类的名字(甚至是类关键字)?如果您使用C++编译器编译C代码,但不知道如何使用C编译器执行此操作,我可以看到它是如何工作的:-( – Mawg