c++ - 使用 extern "C"在 C 文件中调用 C++ 类函数

标签 c++ c

我正在尝试使用 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/

相关文章:

c++ - 如何从装饰元素上移除一层?

c - 如何在已修改的函数外部打印数组值

c - 我想将数据插入二叉树,但在 3 个输入后显示段错误

c - lex 前缀 undefined symbol yyparse

c - 在C中逐行读取每个字符

c++ - 保存指向在本地创建的堆的指针

c++ - 将数据从一个应用程序单向发送到另一个应用程序的最佳实践

c++ - 错误 : expected primary-expression before ‘=’ token when using for loops

c++ - const 和虚拟继承

c - 如何在c中重写char数组?