[英]Calling C++ class functions in C file using extern “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"
我得到的那个文件中的#include "MyClass.h"
error: expected identifier or '(' before string constant
在MyClass.h
中的error: expected identifier or '(' before string constant
,其中定义了externs。
我假设我错过了一些“if cplusplus”或其他extern或其他非常模糊的东西。
extern "C"
没有extern "C"
:C编译器不会理解它并且会阻塞它。 您需要仅将此指令公开给C ++编译器。 这就是为什么经常在这样的标题中你找到这个(一个随机的例子,例如这里 ):
#ifdef __cplusplus
extern "C" {
#endif
... code ...
#ifdef __cplusplus
}
#endif
C预处理器将删除extern "C"
,仅保留附带的代码,而对于C ++编译器,相同的文件将看起来像
extern "C" {
... code ...
}
更新:关于整个extern "C"
构造的目的的几句话,以及为什么它只出现在C ++中,正如Justin Randall在评论中所建议的那样。 也许需要它的主要原因是它可以防止名称损坏 。 当存在相同名称的重载函数时,这很重要:错位名称是唯一的,因此可以区分这些名称。 另一方面,C中没有重载,因此没有名称重写,也不需要extern
块。
简而言之,典型的C ++编译器倾向于将像void f()
这样的函数重命名为_Z1fv
类的_Z1fv
。 但是C编译器会查找f
并失败。 extern "C"
使前者使用后者所期望的相同符号名称。
可以在此处找到更精确的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.