在介绍为什么要声明extern C之前,先要了解C++中的name mangling(命名修饰)。name mangling是指编译器在编译函数或者变量时,会根据函数或变量的类型、参数个数和参数类型等信息来修饰(或者称为重载)函数或变量的名称。这么做的原因是C++支持函数重载,而函数重载需要根据类型、参数个数和参数类型等信息区分同名函数。
但是,这样做也造成了一些问题。比如,当C++代码需要链接C语言库时,因为C语言不支持函数重载,使用C++编写的函数名称被改编后与C语言库函数的名称不一样了,会导致链接失败。
为了解决上述问题,C++提供了extern "C"修饰符。使用extern "C"修饰的代码告诉编译器编译这部分代码时按照C语言规则进行编译,避免命名修饰而导致的链接错误。
还有一种情况,即C++程序要调用其他语言编写的函数库,比如Fortran、Cobol、Pascal等,同样需要使用extern "C"来修饰函数声明,以保证函数名称与其它语言的函数名称一致。
C++中通过在函数外面使用extern "C"声明,将指定函数声明为C语言类型的函数,使用C语言链接规则。extern "C"可以应用在函数声明前、定义前或者定义时。例如:
extern "C" void func0();extern "C" int func1(int a, char b);
extern "C" {
//函数定义
}
需要注意,对于带参数的函数,参数类型、个数、顺序等要和对应的C语言函数保持一致,否则链接时仍然会出现问题。同时,如果函数内部有C++特有的代码,例如STL容器、析构函数等,还是会影响到执行效率甚至会出现错误。因此,在使用extern "C"的时候,需要谨慎而且小心。