extern用于声明外部定义的变量或函数,不分配内存;变量需在一处定义、多处extern声明;extern "C"则用于C与C++混合链接,禁用名字修饰。

extern 关键字在 C++ 中主要用于声明“变量或函数定义在别处”,它本身不分配内存,只告诉编译器:这个符号存在,链接时去找。最常见、也最容易出错的场景,就是多个源文件之间共享全局变量。
extern 声明变量:告诉编译器“这变量在别处定义”
如果想在 file2.cpp 中使用 file1.cpp 里定义的全局变量,不能直接写 int x = 10;(那会重新定义),也不能只写 int x;(C++17 起默认是定义,会报重复定义错误)。正确做法是用 extern 声明:
- file1.cpp 中定义:
int global_count = 42;(有内存分配,是定义) - file2.cpp 中声明:
extern int global_count;(无内存分配,只是声明) - 这样 file2.cpp 就能读写
global_count,链接时自动绑定到 file1.cpp 的定义
头文件中怎么安全写 extern 变量?
多个 .cpp 文件都要用同一个全局变量时,不能把 extern int x; 直接写在头文件里然后被多个源文件 include——虽然语法合法,但容易和定义混淆。推荐做法:
- 在头文件(如 common.h)中写:
extern int config_flag; - 在且仅在一个 .cpp 文件(如 config.cpp)中写定义:
int config_flag = 0; - 其他所有用到它的 .cpp 都 include 这个头文件即可
- 注意:不要在头文件里写
extern int x = 1;——带初始化的 extern 声明会被视为定义,导致重复定义错误
extern "C" 是另一回事:解决 C++ 和 C 的链接差异
名字修饰(name mangling)让 C++ 函数名在链接时变成带类型信息的长名字,而 C 不这么做。如果要调用 C 写的库(比如 printf 或自写 .c 文件),需要用 extern "C" 告诉 C++ 编译器:“按 C 的方式链接,别修饰名字”:
立即学习“C++免费学习笔记(深入)”;
- 单独函数:
extern "C" void c_style_func(int x); - 一整段:
extern "C" {
#include "legacy_c_header.h"
} - 注意:这和变量共享无关,是语言互操作机制,别和普通
extern混用
常见误区提醒
很多人踩坑是因为没分清“声明”和“定义”。记住这几条:
-
extern int x;是声明(不分配内存) -
int x;在全局作用域是定义(C++17 起,等价于int x = 0;) -
extern int x = 5;是定义(带初始化的 extern 就是定义),只能出现一次 - 函数声明默认就是 extern(可省略),所以
void foo();等价于extern void foo();
基本上就这些。extern 本身不复杂,但用错位置或混淆声明/定义,就会引发链接错误或重复定义错误,多文件协作时尤其要注意定义只出现一次。










