C++ | extern "C" 的用法

发布时间 2023-08-03 18:50:40作者: C111-CR

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语言库的代码。