extern 的作用

Posted by KalosAner on March 13, 2025

一、声明变量或函数

extern 用来声明某变量或函数在其它文件中(extern 是声明外部变量或函数,之前总是以为向外暴露自身的变量或函数)。

extern int val 可以用来声明变量 val 来自其他源文件(是源文件不是头文件,头文件直接 include 就可以了),这样链接器在链接阶段会去其它文件寻找定义,但是变量 val 在其他文件中不能是 static 声明的。

例如:

1
2
3
4
5
6
7
8
9
// file1.c
int val;
int func();

// file2.c
extern int val;

// file3.c
extern int func();

二、extern “C”

C++ 支持函数重载,编译期会修改函数名,而 C 不会。

用 extern “C” 包裹 C 代码,告诉 C++ 编译器按 C 的 规则来处理函数名,确保链接正确。

1
2
3
4
5
6
7
8
#ifdef __cplusplus
extern "C" {
#endif
void c_func();

#ifdef __cplusplus
}
#endif

三、extern 修饰的变量

extern 修饰的变量在哪个数据段?

extern 仅仅量声明,不分配内存,需要看变量定义时的初始化状态

  • 已初始化的全局变量放在 .data 段
  • 未初始化的全局变量放在 .bss 段

文件 a.cppb.cppc.cpp 共同编译链接,如果文件 a.cppb.cpp 同时定义了全局变量 int val,并且 c.cpp 使用 extern int val 声明外部变量会导致编译链接错误。

四、扩展

extern “C” 不能修饰类或模板;

extern 变量可多次声明。