/*How does this code compiles and executes in C?*/
#include <stdio.h>
int x= 9; //Varaible initialization
int x; //Variable declaration, same name
int main(void) {
printf("%d", x); //output: 9
return 0;
}
编译时应该出错,因为使用了相同的变量。为什么代码会编译?
答案 0 :(得分:1)
从standard 6.9.2p2您可以了解到这一点 - 这被称为暂定定义。
来自here
暂定定义是没有初始化程序的外部声明,没有存储类说明符或指定符静态。
暂定定义是可能会或可能不会作为定义的声明。 如果在同一翻译单元中较早或较晚发现实际的外部定义,则暂定定义仅作为声明。
int i1 = 1; // definition, external linkage
int i1; // tentative definition, acts as declaration because i1 is defined.
因此,从这两个参考文献可以清楚地看出,第二个参考文献仅仅归结了关于标准词的声明或有效的定义定义,它所采用的值是1
分配的值。
Sane以x
为9
的价值为您而来。
答案 1 :(得分:0)
您可以根据需要多次声明全局变量或函数。但是你必须只有一个定义。第一行为变量赋值,因此它是一个声明和定义的组合。第二行没有赋值,因此它只是一个声明。
答案 2 :(得分:0)
第二个是不定义。它是声明。
来自ISO C standard draft N1570, Section 6.9.2:
1如果对象的标识符声明具有文件范围和初始值设定项,则声明是标识符的外部定义。
2 具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符
static
的对象的标识符声明构成暂定定义。如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则行为就像翻译单元包含文件范围声明一样该标识符,其复合类型为翻译单元的末尾,初始化程序等于0。
所以当你写
int x;
在文件范围内,它不一定是定义。它是一个声明,可以重复。
答案 3 :(得分:0)
在全局范围内,可以使用两个具有相同名称的变量,但其中一个应为un-intialized(weak symbol)
,另一个应为initialized(strong symbol)
。
int x= 9; /* strong symbol i.e declaration with definition*/
int x; /* weak symbol i.e only declaration */
在两者中进行选择时,优先级为两个strong
符号。
注意:编译器不允许一次two strong symbol
,这将是变量的re-definition
。