重新定义全局变量时,为什么重新定义静态全局变量会产生编译时错误?

编译代码1给出错误’ i redefined ‘,但代码2显示没有类似的错误。 为什么会这样?

代码1

 static int i; //Declaring the variable i. static int i=25; //Initializing the variable. static int i; //Again declaring the variable i. int main(){ return 0; } 

代码2

 int i; //Declaring the variable i. int i=25; //Initializing the variable. int i; //Again declaring the variable i. int main(){ return 0; } 

两者都应该编译。

int i;static int i; 是C中的暂定定义 ,因为它们没有初始值并且不是extern 。 只要定义在类型或链接中不冲突,就可以为翻译单元中的任何对象提供多个暂定声明和至多一个非暂定定义。

ISO / IEC 9899:1999 6.9.2:

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