#include <stdio.h>
int b;
int b = 5;
int b;
int main() {
printf("%dn", b);
return 0;
}
以上编译并成功运行。请注意,这仅在全局范围内可行,在CCD_ 1内部执行相同操作将不会编译。
这是因为int b;
就是a declaration and a tentative definition
,并且在C中允许多个暂定定义,即使是在全局定义之后完成的?
当在文件范围内声明时,没有初始化器和存储类说明符(即extern
或static
(的变量构成临时定义。可以有任何数量的这些,但最多有一个";"满";包含初始值设定项的定义。
C标准第6.9.2p4节给出了这些以及其他示例:
int i1 = 1; //definition, external linkage static int i2 = 2; //definition, internal linkage extern int i3 = 3; //definition, external linkage int i4; //tentative definition, external linkage static int i5; //tentative definition, internal linkage int i1; //valid tentative definition, refers to previous int i2; //6.2.2 renders undefined, linkage disagreement int i3; //valid tentative definition, refers to previous int i4; //valid tentative definition, refers to previous int i5; //6.2.2 renders undefined, linkage disagreement extern int i1; //refers to previous, whose linkage is external extern int i2; //refers to previous, whose linkage is internal extern int i3; //refers to previous, whose linkage is external extern int i4; //refers to previous, whose linkage is external extern int i5; //refers to previous, whose linkage is internal