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编译器编译的?

+5

其他答案不说*“在头文件中,放*”。它说*“然后在C++中执行函数调用:*”。 C编译器只能处理声明,而不能处理函数定义。 –

+1

只将声明放在头文件中,这些函数的定义需要由C++编译器编译。 –

+0

@BoPersson对不起,但我是一个非常小的大脑Mawg。你能解释一下,好像五岁的孩子吗?当然,C代码迟早会引用一个类的名字(甚至是类关键字)?如果您使用C++编译器编译C代码,但不知道如何使用C编译器执行此操作,我可以看到它是如何工作的:-( – Mawg

您应该在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