C/C++ 中 static 如何限制全局变量跨文件访问
在 C 和 C++ 里,一个全局变量能不能被另一个文件直接访问,不看它是不是全局,而看它被赋予了哪种链接属性。外部链接(external linkage)允许跨翻译单元共享,内部链接(internal linkage)则把符号锁在当前文件里。static 关键字就是完成这个转换的关键。
默认行为:外部链接
先看最普通的情况。假设 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 prog 不会有任何问题。因为 g 默认具有外部链接,它的符号会被写进目标文件的符号表,链接器能把它解析到所有需要的地方。
用 static 转为内部链接
如果在变量前面加上 static :
// a.cpp
static int s = 20;
然后在 b.cpp 里依然 extern int s;,编译时语法检查能过,但链接阶段会直接报错:undefined reference to 's'。
static 把符号的作用域压缩到了当前翻译单元(即当前的 .cpp 文件),这个符号干脆不会出现在导出表里。相当于给这个全局变量加了一个'文件级锁',其它文件永远看不见它。
常见的误解:#include 不等于跨文件
有人觉得把 .cpp 文件像头文件一样 #include 进来就能绕开限制:
// a.cpp
static int trick = 30;
// b.cpp
#include "a.cpp"
int main() {
return trick;
}


