
核心结论:能否跨文件取决于符号的链接属性——外部链接可跨文件,内部链接不可跨文件;
static正是把外部链接改成内部链接的关键字。
三个实验:30 秒看懂全局变量跨文件能力
| 实验 | 变量定义 | 链接属性 | extern 能否跨文件访问? | 结果 |
|---|---|---|---|---|
| 1️⃣ 普通全局变量 | int g = 10; | 外部链接 | ✅ 可以 | 成功链接 |
2️⃣ static 全局变量 | static int s = 20; | 内部链接 | ❌ 不行 | 链接报错:undefined reference |
3️⃣ #include 假装跨文件 | #include "a.cpp" | 内部链接 | ❌ 仍是内部 | 无意义 |
实验一:普通全局变量
在 a.cpp 中定义一个普通全局变量:
// a.cpp
int g = 10; // 外部链接
在 b.cpp 中通过 extern 引用它:
// b.cpp
extern int g;
int main() {
return g;
}
编译命令如下:
g++ a.cpp b.cpp -o ok # ✅ 通过
此时 g 的符号被导出到目标文件,所有翻译单元都能看见它。
实验二:static 全局变量
如果在 a.cpp 中使用 static 修饰:
// a.cpp
s = ;


