背景: c++需要兼容c代码,当它调用c编译器生成的目标文件时会报错。如,
举例:
前提条件说明——已经使用gcc生成了一个c_xxx.o的目标文件。c++文件内容如下:
//c++文件yyy.cpp
#include "c_xxx.h" //这里包含了c代码的头文件
int main(void)
{
c_func(); //这里调用了c代码里的函数
}
然后使用g++ yyy.cpp c_xxx.o进行编译,这时候会报错。
解决办法:
使用extern关键字,让c代码使用gcc编译,如下:
//c++文件
extern "C"
{
#include "c_xxx.h" //这里包含了c代码的头文件
}
int main(void)
{
c_func(); //这里调用了c代码里的函数
}
拓展问题: 如果反过来,直接将c++代码复制到c文件中用gcc编译就会报错,因为c编译器不支持extern "C"语法。那么有什么办法可以让这段代码同时支持c和c++呢?
解决办法:
c++编译器内置标准宏定义__cplusplus,所以当使用g++编译时该宏定义会被定义,而gcc则没有。
利用这一点,可以使用下面这个格式实现兼容。
#ifdef __cplusplus
extern "C"{
#endif
#include "c_xxx.h" // <= 这里为c代码
#ifdef __cplusplus
}
#endif
注意:extern "C"中的代码块不能出现重载函数。因为对于重载函数,c++编译方式将函数名和参数列表编译成目标名,本质上最终生成了不同的函数名;而c语言则是只将函数名作为目标名进行编译,也就是生成同名的函数,会导致冲突。