原因是因为有很多功能是用 C 语言开发的,而 C++是兼容 C 的,C++应该能直接使用这些功能,那么我们把 C++调用 C 实现的功能的这个做法,称为混合编程
但是用 C 开发的功能,很可能已经用 C 编译器编程成目标文件(或打包成库了),那么目标文件中的函数名已经确定下来了,C++去调用函数时,会进行换名处理,将导致,在目标文件中找不到对应的函数
为什么 C++会去改变函数名呢,因为 c++支持函数重载,只要参数不同,返回值不同函数名可以相同,因为 c++会将函数的名字根据返回值以及参数重新生成一个名字,验证的话可以使用-c 编译一个.o 文件,然后用 nm 命令去查看里面的内容,例如:
那么怎么解决 c++会对 c 函数进行换名处理而找不到定义呢?
在 C++中提供了一个关键字:extern "C",称为链接指示,即告诉 C++编译器,用 extern "C" 修饰的函数,是用 C 编译器编译的,当调用这个函数的时候,不要去修改它们的名字,大多数情况下,extern "C" 是写在头文件中的。但是因为 C 语言不认识这个关键字,所以在编译代码时,我们得区分编译器是 C 的编译器,还是 C++的编译器,C++编译器中预定义了一个宏,叫:_cplusplus,C 编译器没有定义这个宏,所以,我们可以根据这个宏来区分是哪个编译器在编译代码,例如:
cpp
#ifdef _cplusplus
extern "C"
{
#endif
int sum(int a, int b);
double fun();
#ifdef _cplusplus
}
#endif
可以看到,如果是 C++编译器,那么就会调用 extern "C"对函数进行兼容处理。