问答题 在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"
【正确答案】
【答案解析】C++语言是一种面向对象编程语言,支持函数重载,而C语言是面向过程的编程语言,不支持函数重载,所以函数被C++编译后在库中的名字与C语言的不同。如果声明一个C语言函数float f(int a,char b),C++的编译器就会将这个名字变成像_f_int_char之类的东西以支持函数重载。然而C语言编译器的库一般不执行该转换,所以它的内部名为_f,这样连接器将无法解释C++对函数f()的调用。
C++提供了C语言Altemate likage specifications(替代连接说明)符号extern "C"来解决名字匹配问题,extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在模块或其他模块中使用。extern后跟一个字符串来指定想声明的函数的连接类型,后面是函数声明。
extern "C" float f(int a,char b);
该语句旨在告诉编译器f()是C连接的,这样C++就不会转换函数名。标准的连接类型指定符有“C”和“C++”两种,但编译器开发商可以选择用同样的方法支持其他语言。如果有一组替代连接的声明,可以把它们放在花括号里:
extern "C"
{
float f(int a,charb);
...∥其他函数
}
或者写成
extern "C"
{
#include "Myheader.h"
...∥其他C头文件
}
这就告诉C++编译器,函数f是采用C语言方式链接的,应该到库中找名字_f而不是找_f_int_char。C++编译器开发商已经对C标准库的头文件作了extern "C"处理,所以可以用#include直接引用这些头文件。