众所周知,C++编译器和C编译器的编译方式有很大的不同(C编译器无法向上兼容),LINK时的寻址方式也不一样,例如:
* c*/
int strlen(char* string)
{
…
}
//c++
int strlen(char* string)
{
…
}
两个函数完全一样。在c中函数是通过函数名来识别的,而在C++中,由于存在函数的重载问题,函数的识别方式通函数名,函数的返回类型,函数参数列表三者组合来完成的。因此上面两个相同的函数,经过C,C++编绎后会产生完全不同的名字。所以,如果把一个用c编绎器编绎的目标代码和一个用C++编绎器编绎的目标代码进行连接,就会出现连接失败的错误。
所以我们往往会在C头文件中加入
#ifdef __cplusplus
extern “C”
{
#endif
#ifdef __cplusplus
}
#endif
用于告诉C++编译器,以C编译器的方式进行编译连接,换句话说,就是“请保持我的名称,不要给我生成用于链接的中间函数名”。
4楼的朋友在C++头文件中给函数前面加extern “C”,是告诉编译器,强制以C的方式进行编译(C++编译器能够向下兼容),这样一来,C文件就能正常调用这些函数(很多时候我们都会把C++代码编译成dll或lib,然后用extern “C”来定义一个专门的接口导出文件,以便C能够正常调用)。但是这种方法也有缺点,如果一个函数的参数是一个类或者引用,或者函数返回值是一个类指针,此时你的C代码将无法正常调用(这一点,纯属个人经验,如果哪位朋友能够实现,请速告知与本人,不甚感激!)。
也就是说在C++头文件中加入 extern “C”的方式,只适合用C风格定义的函数。
转载请注明:在路上 » 【转】怎样在C函数中调用C++代码