编译代码1会出现错误“i redefined
”,但代码2显示没有类似的错误。为什么会这样?
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;
}
int i; //Declaring the variable i.
int i=25; //Initializing the variable.
int i; //Again declaring the variable i.
int main(){
return 0;
}
答案 0 :(得分:10)
两者都应该编译。
C中的int i;
和static int i;
都是暂定定义,因为它们没有初始值设定项且不是extern
。只要定义在类型或链接中不冲突,就可以为翻译单元中的任何对象提供多个暂定声明和至多一个非暂定定义。
ISO / IEC 9899:1999 6.9.2:
具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符
static
的对象的标识符声明构成暂定定义 。如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元结尾,初始化程序等于0。