在 C++ 中,extern "C" 的作用是告诉编译器按照 C 语言的规范来处理函数名和变量名。这是因为 C++ 编译器会对函数名和变量名进行名称修饰(name mangling),以区分不同的函数和变量。而在 C 语言中,函数名和变量名不会被名称修饰,因此需要使用 extern "C" 来告诉编译器使用 C 语言的规则。
下面是微软官方文档关于“extern "C"”的使用说明:
extern (C++) | Microsoft Learn
extern (C++) | Microsoft Learn
以下示例演示如何声明具有 C 链接的名称:
// Declare printf with C linkage.
extern "C" int printf(const char *fmt, ...);
// Cause everything in the specified
// header files to have C linkage.
extern "C" {
// add your #include statements here
#include <stdio.h>
}
// Declare the two functions ShowChar
// and GetChar with C linkage.
extern "C" {
char ShowChar(char ch);
char GetChar(void);
}
// Define the two functions
// ShowChar and GetChar with C linkage.
extern "C" char ShowChar(char ch) {
putchar(ch);
return ch;
}
extern "C" char GetChar(void) {
char ch;
ch = getchar();
return ch;
}
// Declare a global variable, errno, with C linkage.
extern "C" int errno;
首先看看 C++
中,在未加 extern "C" 声明时,对类似 C
的函数是怎样编译的:
作为一种面向对象的语言, C++
支持函数重载,而过程式语言 C
则不支持。所以,函数被 C++
编译后在符号库中的名字与 C
语言的有所不同。例如,假设某个函数的原型为:
void foo( int x, int y );
该函数被 C
编译器编译后在符号库中的名字为 _foo
,而 C++
编译器则会产生像 _foo_int_int
之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为名称修饰(name mangling) 。 _foo_int_int
这样的名字包含了函数名、函数参数数量及类型信息, C++
就是靠这种机制来实现函数重载的。例如,在 C++
中,函数 void foo( int x, int y )
与 void foo(int x, float y )
编译生成的符号是不相