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

Sur*_*uri 7 c

编译代码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;
}
Run Code Online (Sandbox Code Playgroud)

代码2

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

CB *_*ley 10

两者都应该编译.

这两个int i;static int i;试探性的定义,用C,因为他们没有一个初始化并没有extern.只要定义在类型或链接中不冲突,就可以为翻译单元中的任何对象提供多个临时声明和最多一个非暂定定义.

ISO/IEC 9899:1999 6.9.2:

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