多个文件使用同一全局变量(未初始化) 以及局部变量重复定义

如果是多个文件中同一变量,是由C语言编译器中的linker解决的。
首先,要编译的文件中的符号(函数名,全局变量名)分为weak和strong类型。
weak symbol:未初始化的全局变量
strong symbol:函数名,初始化的全局变量
linker解决按3条规则解决此问题
1,多个相同名称的strong symbol是不被允许的
2,一个strong symbol和多个weak symbol相同,选strong symbol
3,多个weak symbol相同,会任意选一个

详细参见CS:APP 7.6.1节,How linkers resolve multiply defined global symbols

///

file1.c

int b;

int b;

int b;

编译通过不会警告

//

file2.c

int b=1;

int b=2;

报错,重复定义

//


全局变量的处理和局部变量有所不同。全局中未赋初值的变量都被视作声明而非定义,例如
int i;/*对于全局变量而言这些都只是声明一个符号*/
int i;
int i;
int i;
int i;
int i = 6;/*这里分配了空间*/
以上没有任何问题,但是如果有两个地方都赋了初始值就不行了,例如
int i = 6;
int i = 6;
这就会有重复定义的error。

对于函数中的变量,任何不带extern的声明都是定义,即局部变量立刻分配空间,所以
int i;
int i;
也会报错。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值