extern 只能声明不能定义变量;全局变量必须且仅在一个.cpp中定义,其余文件用extern声明;头文件中应只放extern声明,不可初始化;const全局变量需显式extern才可跨文件使用;extern "C"仅用于函数链接规范。

extern 不能“定义”变量,只能“声明”它——搞混这点,链接时必报 undefined reference 或 multiple definition 错误。
extern 声明全局变量的正确写法
全局变量必须且仅能在**一个 .cpp 文件中定义**(带初始化或不带初始化都算定义),其余所有用到它的文件,只允许用 extern 声明。
- ✅ 正确:在
global.cpp中写int g_count = 42;(定义);在main.cpp中写extern int g_count;(声明) - ❌ 错误:在头文件
common.h里写extern int g_count = 100;—— 赋值会让编译器把它当定义,多个源文件包含该头文件就触发multiple definition - ⚠️ 注意:
extern int g_count;和int g_count;在全局作用域下语义完全不同:前者是声明,后者是定义(即使没初始化)
头文件里怎么安全共享变量声明
头文件不是用来放定义的地方,但可以集中管理 extern 声明——靠 #ifndef + extern + 不带初始化。
- 在
globals.h中写:#ifndef GLOBALS_H #define GLOBALS_H extern int g_config_flag; extern const char* g_app_name; #endif
- 在
globals.cpp中写定义:int g_config_flag = 0; const char* g_app_name = "myapp";
- 所有需要访问的 .cpp 文件只需
#include "globals.h",无需重复写extern - ⚠️
const全局变量默认内部链接(internal linkage),想跨文件用必须显式加extern声明,否则其他文件看不到
extern "C" 是另一回事,别和 extern 变量混淆
extern "C" 是链接规范说明符,解决 C++ 函数名修饰(name mangling)问题,和变量声明无关。它常用于:
立即学习“C++免费学习笔记(深入)”;
- 在 C++ 代码里调用 C 库函数:
extern "C" { #include "some_c_header.h" } - 导出 C 风格接口供 C 代码调用:
extern "C" int legacy_api(int x) { return x * 2; } - ⚠️
extern "C"不能修饰变量定义(如extern "C" int x = 1;是非法的),仅限函数和函数指针
多文件共享变量最易错的点,其实是把“声明”和“定义”当成一回事——尤其在头文件里随手加个 int x;,以为只是声明,结果成了定义。记住:只要没 extern,全局作用域下的变量语句就是定义。










