extern "c"的主要作用就是为了能够正确实现C++代码调用其它C语言代码。加上extern "c"后,会指示编译器这部分代码按照C语言的风格进行编译。
由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;C语言并不支持函数重载,因此编译C代码的函数时不会带上函数的参数类型,一般只包括函数名。
这个功能十分有用,因为在C++出现以前,很多代码都是C语言写的,而且底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "c"就是其中的一个策略。
这个功能主要用在下面的情况:
1、C++代码调用C语言代码
2、在C++的头文件中使用
3、在多个人协同开发时,可能会出现有人编写C代码,有人能编写C++代码,这样的情况也可以使用extern "c"。
extern "c"包含双重语义,从字面上可以知道,首先,被他修饰的目标是"extern"的;其次,被他修饰的目标代码是"C"的。被extern "c"限定的函数和变量
是extern的。
看这个例子: extern int a; 仅仅是一个变量的声明,并不是在定义变量a,也没有为a分配空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出错。
extern "c"使用要点:
1、可以使单一语句。
extern "c" double sqrt(double)
2、可以使复合语句,相当于复合语句中的声明都加了extern "c"。
extern "c"
{
double sqrt(double);l
int min(int,int);
}
3、可以包含头文件,相当于头文件中的声明都加了extern "c"。
extern "c"
{
#include<cmath>
}
4、不可以将extern "c"添加到函数内部。
5、如果函数有多个声明,可以都加extern "c",也可以只出现在第一次声明中,后面的声明会接受第一个链接指示符的规则。