说一说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 语言的方式进行编译和链接。