全局变量
我们都知道全局变量具有全局链接属性。
A.cpp
int a = 0;
B.cpp
extern int a ;
int main()
{
a =1 ;
}
这是因为当链接的时候,链接器处理 B.cpp 经过处理的 B.o 的时候,发现一个未解析的全局符号。这个时候继续往后处理,当链接器扫描其他源文件的符号表的时候发现了 该全局符号,如果这个全局符号是已初始化的,那么它就是强状态的GLOBAL符号,也就是可以立即连接。如果是未初始化的全局符号,并不会立即解析,对于未初始化的全局符号会被放到COMMON列中,放到该列的全局符号都是弱状态的。
对于符号解析的时候,直到遇到了一个强状态的全局符号或者 从所有的弱状态的全局符号随机绑定一个。
static 修饰全局变量
static 修饰全局变量后,该变量符号在符号表中的 Bind 属性变为 local ,对于符号解析原则,当遇到了一个local符合立即解析,并不会继续再去后续的其他源文件中对相应的同名全局符号进行解析绑定。
所以经 static 修饰后的全局变量与全局函数在本源文件的链接期时,当这些全局符号被链接的时候会被立刻绑定到文件中相应的符号。当其他源文件在链接的时候同样看到local属性的全局符号并不会对其绑定。所以经由 static 修饰后,全局变量与函数只在当前源文件内有效,不会被链接到其他源文件中。
注意这个local 并不是局部变量。 这个只是 符号表中的Bind(链接)属性。