您的位置:首页 > 其它

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

2018-01-06 09:29 323 查看
如果是多个文件中同一变量,是由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.cint b;int b;int b;编译通过不会警告//////////////////////////////////////////////////file2.cint 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;
也会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐