如果是多个文件中同一变量,是由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;
也会报错。