一、声明变量或函数
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.cpp
、 b.cpp
、 c.cpp
共同编译链接,如果文件 a.cpp
、 b.cpp
同时定义了全局变量 int val
,并且 c.cpp
使用 extern int val
声明外部变量会导致编译链接错误。
四、扩展
extern “C” 不能修饰类或模板;
extern 变量可多次声明。