最近刚换了工作,刚进新公司几天,领导就给安排了一项任务:把项目里的c源文件改成cpp源文件,同时解决编译问题。修改文件扩展名虽容易,但会遇到各种问题,其中一个就是:undefined refrence to xxx,即未找到某某函数的实现。
出问题的原因是原来都是c实现的,在要使用的地方,直接extern+函数原型 声明即可。若此函数是c++实现的,也可以这样使用,但若函数是c实现的,在使用的地方再用extern+函数原型 声明则会找不到函数符号。解决办法就是添加上如:
extern "C" {
//函数原型 声明
}
若此函数声明在头文件,实现在.c文件,则两个地方都要加上。因为头文件可能也要被其他.c文件包含,但c语言里是没有extern "C"的,所以得加上 #ifdef __cplusplus,即如下:
#ifdef __cplusplus
extern "C" {
//函数原型 声明
}
#endif
这样.c文件也可以包含此类头文件而不会有编译问题。
总结:
extern "C" 的主要作用就是为了能够正确实现C++代码调用C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。