头文件中只能用extern声明全局变量,定义必须唯一出现在一个.cpp文件中;const全局变量默认内部链接,跨文件共享需显式extern声明;extern"c"用于指定c链接方式,与extern声明无关。

全局变量不能在头文件里直接定义,否则多文件包含时会链接失败;extern 是声明而非定义,它本身不分配内存。
头文件里只能声明,不能定义全局变量
很多人在 common.h 里写 int g_count = 0;,结果多个 .cpp 包含它后,链接时报 multiple definition of 'g_count'。这是因为每个编译单元都生成了一份定义。
- ✅ 正确做法:头文件中只用
extern int g_count;声明 - ✅ 定义必须且只能出现在一个
.cpp文件里(如global.cpp),写成int g_count = 0; - ❌ 不要写
extern int g_count = 0;—— 带初始化的extern在 C++ 中是定义,不是声明
extern 和 const 全局变量的特殊规则
C++ 中 const 全局变量默认具有内部链接(internal linkage),即使不加 static,也不会被其他文件看到。
- 如果想跨文件共享
const int g_version = 1024;,必须显式加extern声明:extern const int g_version;(头文件) +const int g_version = 1024;(一个.cpp) - 否则其他文件即使
#include头文件,也看不到这个常量,编译报undefined reference - 注意:C++17 起可用
inline constexpr替代,更安全简洁
extern "C" 是另一回事,别和 extern 混用
extern 关键字单独出现时,只管链接属性;加上 "C" 字符串字面量后,就变成告诉 C++ 编译器“按 C 的方式命名和调用”,和全局变量定义无关。
立即学习“C++免费学习笔记(深入)”;
-
extern int g_flag;→ 声明一个 C++ 链接的全局变量 -
extern "C" int g_flag;→ 声明一个 C 链接的全局变量(通常用于混编或系统 API) - 混用如
extern "C" { extern int g_x; }合法但冗余,除非你真在对接 C 库的全局符号
最容易忽略的是:extern 声明可以多次(跨头文件、多次 #include 都行),但定义只能一次;而一旦某个地方不小心给 extern 变量赋了初值,它就不再是声明,成了定义——这时重复包含就会爆炸。










