同一文件中的外部和全局相同变量

时间:2014-02-01 23:26:19

标签: c

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 - >运行完美。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

这是由于“暂定”定义规则:

  

[C90: 6.9.2/2]:具有文件范围而没有初始化程序且没有存储类说明符或存储类说明符static的对象的标识符声明构成暂定定义。如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元结尾,初始化程序等于0。

这说明B.c中的x具有文件范围,因此它与A.c中的x不冲突。

请注意,C ++中不存在此规则;这是C和C ++不同的一个例子。