extern "C"
是C++中的一种用法(无法在C语言中使用),其作用是 修饰一段代码,将其用C语言的方式进行编译。
那么,使用C语言方式进行编译与使用C++方式进行编译又有什么区别呢?
在C++中,支持函数重载:
void func();
void func(int a, int b);
void func(double a, float b);
但在C语言中如果编译函数func()
,其在符号库中的名字为_func
,也就是说与参数无关,只和函数名字相关。因此,C语言中无法实现函数重载,因为他们在符号库中的标识都是一样的。
而在C++中,一个函数编译后生成的名字是用函数名加上参数类型和数量构成的,比如void func(int a, int b)
对应的名字是_func_int_int
,而void func(double a, float b)
对应的名字是_func_double_float
,这样实际上就将名字相同的重载函数变成了不同的函数(编译过后)。
因此,extern "C"
的作用就显示出来了:实现C++与C语言的混合编程
代码一旦被extern "C"
修饰之后,它便以C语言的方式工作(编译阶段:以C的方式编译;链接阶段:寻找C方式编译生成的符号)。 在C语言中引用 C++
库的函数或 C++中引用 C
库的函数,都可以通过这个方式实现兼容。
-
在C++中使用C语言库:
// C++中的 <stdio.h> 有以下代码 #ifdef __cplusplus extern "C" { #endif // ... #ifdef __cplusplus } #endif
其中,宏定义
__cplusplus
是识别是否使用了C++进行编译的标志,这样一来,就可以在使用C++时直接调用C语言的库而不用担心使用C++的编译器无法编译C语言库的代码。