为什么 static 修饰全局变量或者函数后 只在当前源文件内有效

全局变量

  我们都知道全局变量具有全局链接属性。

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(链接)属性。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值