A.C
extern int x;
int x = -22;
int main(){}
B.c
void mai();
int x = 100;
void mai(){}
gcc A.c B.c - >给出多重定义错误
A.C
extern int x;
int x = -22;
int main(){}
B.c
void mai();
int x;
void mai(){}
gcc A.c B.c - >运行完美。
有人可以解释一下吗?
答案 0 :(得分:2)
这是由于“暂定”定义规则:
[C90: 6.9.2/2]:
具有文件范围而没有初始化程序且没有存储类说明符或存储类说明符static
的对象的标识符声明构成暂定定义。如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元结尾,初始化程序等于0。
这说明B.c中的x
具有文件范围,因此它与A.c中的x
不冲突。
请注意,C ++中不存在此规则;这是C和C ++不同的一个例子。