extern "C"的主要作用就是为了能够正确实现C++代码调用其它C语言代码。
加上extern “C”后,会指示编译器将这部分代码按C语言进行编译,而不是C++的。这是因为C++支持函数重载,因此,编译器在编译函数的过程中会将函数参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
extern "C"包含两层含义:
1. extern关键字告诉编译器其声明的函数和变量可以在本模块或其他模块中使用。
在模块的头文件中对本模块提供给其他模块引用的函数和全局变量以关键字extern生命。与extern对应的是static,static表明变量或函数只能在本模块中使用,因此,被static修饰的变量或函数是不可能被extern “C”修饰的。
2. “C”表示编译器在编译时会按照C编译器的方式进行编译。
extern "C"使用要点:
1. 可以是单一语句
extern "C" double sqrt(double);
2. 可以是复合语句,这相当于复合语句中的声明都加上了extern “C”
extern "C" { double sqrt(double); int min(int, int); }
3. 可以包含头文件,相当于头文件中的声明都加上了extern “C”
extern "C" { #i nclude <cmath> }
4. 不可以将extern “C”添加在函数内部
5. 如果函数有多个声明,可以都加extern “C”,也可以只出现在第一次的声明中,后面的声明会接受第一个链接指示符的规则。
6. 除了extern “C”,还有extern “FORTRAN”等。