extern声明变量时不分配内存,仅作外部声明;真正定义(含内存分配)必须且只能在单一.cpp文件中完成,否则将导致链接错误。

extern 声明变量时,不分配内存
在 C++ 中,extern 本身不定义变量,只告诉编译器“这个变量在别处定义了”。它只是声明(declaration),不是定义(definition)。如果你在头文件里写 extern int g_count;,那只是承诺“会有个全局 int g_count”,真正分配内存的必须是且只能是一个 .cpp 文件里的定义,比如:
int g_count = 0;。否则链接时会报
undefined reference to 'g_count'。
跨文件共享全局变量的正确写法
常见错误是把 extern int g_count; 和 int g_count = 42; 都塞进头文件——这会导致每个包含该头文件的 .cpp 都尝试定义一次 g_count,链接时报 multiple definition 错误。
正确做法是:
- 头文件(如
global.h)只放声明:extern int g_count;
- 一个源文件(如
global.cpp)负责定义:int g_count = 0;
- 其他所有要用它的
.cpp文件,只#include "global.h",不重复定义
extern "C" 是另一回事,别混用
extern "C" 和跨文件变量无关,它是用来禁用 C++ 的名字修饰(name mangling),让函数能被 C 代码调用,或调用 C 库函数。例如:
extern "C" { void legacy_func(); }。如果误写成 extern "C" int g_count;,虽然语法合法,但对变量链接行为没实际帮助,还可能误导自己。
立即学习“C++免费学习笔记(深入)”;
替代方案:优先考虑 static 或 inline 变量
C++17 起推荐用 inline 变量替代 extern 全局变量,避免头文件/源文件分离的繁琐:
inline int g_count = 0;
放在头文件里即可,多个翻译单元包含它也不会报错。而 static 全局变量虽也定义在头文件中,但每个 .cpp 会获得独立副本,无法真正共享。
真正需要跨文件共享状态时,extern 仍有效;但容易出错,务必确保“一处定义、多处声明”这个约束被严格执行。











