说一说extern“C”

extern "C" 是一种链接指定符(linkage specification),用于在 C++ 代码中包含 C 语言的函数或者变量。

C++ 支持函数重载,即可以有多个名称相同但参数类型或数量不同的函数。为了支持这种重载,C++ 在编译时会对函数名进行”名字修饰”(name mangling)或”名字装饰”(name decoration),即根据函数的参数类型和数量生成一个唯一的名字。这样,链接器可以区分不同的重载函数。

然而,C 语言并不支持函数重载,也就没有名字修饰的概念。因此,如果你在 C++ 程序中直接调用 C 语言的函数,由于名字修饰的不匹配,链接器可能无法找到正确的函数。

extern "C" 的作用就是告诉 C++ 编译器,按照 C 语言的方式来处理被 extern "C" 修饰的函数或变量,即不进行名字修饰,从而实现 C++ 和 C 语言的互操作。

以下是一个例子:

// This is a C function.
// compiles this function with C linkage
extern "C" void foo(int a, int b) {
    // function body...
}

在这个例子中,函数 foo 将按照 C 语言的方式进行编译和链接,即它的名字不会被修饰。

同样,extern "C" 也可以用于包含整个 C 语言的头文件,例如:

extern "C" {
#include "c_header.h"
}

在这个例子中,c_header.h 中的所有函数和变量都将按照 C 语言的方式进行编译和链接。

发表评论

后才能评论