在C中定义全局变量后重新声明全局变量


#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中允许多个暂定定义,即使是在全局定义之后完成的?

当在文件范围内声明时,没有初始化器和存储类说明符(即externstatic(的变量构成临时定义。可以有任何数量的这些,但最多有一个";"满";包含初始值设定项的定义。

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