我正在尝试使用 extern "C"
来调用不同 C 文件中的 C++ 类。在我实际将 .h
包含在我想从中调用 C++ 类的 C 文件中之前,我可以很好地构建它。
MyClass.cpp
MyClass::MyClass(){};
MyClass::~MyClass(){};
extern "C" void* MyClassInit(){
return new MyClass();
}
MyClass.h
extern "C" void* MyClassInit();
好的 - 上面的编译。但是现在我想在另一个 .c
文件中使用 MyClassInit
。只要我
#include "MyClass.h"
在我得到的文件中
错误:
。MyClass.h
中定义了外部表达式的字符串常量前需要标识符或“(”
我假设我遗漏了一些“if cplusplus”或另一个 extern 或其他非常晦涩的东西。
最佳答案
C 中没有 extern "C"
:C 编译器不会理解这一点,并且会因此而窒息。您只需要将此指令公开给 C++ 编译器。这就是为什么您经常在此类 header 中找到它(一个随机示例,例如 here ):
#ifdef __cplusplus
extern "C" {
#endif
... code ...
#ifdef __cplusplus
}
#endif
C 预处理器将删除 extern "C"
,仅保留包含的代码,而对于 C++ 编译器,相同的文件将如下所示
extern "C" {
... code ...
}
更新:关于整个extern "C"
构造的目的,以及为什么它只出现在 C++ 中的原因,正如 Justin Randall 在评论中所建议的那样.也许需要这样做的主要原因是它可以防止 name mangling .当存在同名的重载函数时,这一点很重要:错位的名称是唯一的,因此可以区分它们。另一方面,C 中没有重载,因此也没有名称修改,也不需要 extern
block 。
长话短说,典型的 C++ 编译器倾向于重命名像 void f()
这样的函数,例如,重命名为像 _Z1fv
这样的东西。但是 C 编译器会查找 f
并失败。 extern "C"
使前者使用后者所期望的相同符号名称。
可以找到更精确的信息here .
关于c++ - 使用 extern "C"在 C 文件中调用 C++ 类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48665748/