我有下面的C代码,我希望它会抛出像“多个变量声明”这样的错误,但它没有这样做。
#include <stdio.h>
int i;
int i;
int main()
{
printf("%d",i);
return 0;
}
现在输出为0
,但为什么?
代码下面还有一件事会给出错误预期
#include <stdio.h>
int main()
{
int i;
int i;
printf("%d",i);
return 0;
}
O / p是错误的说再次声明我
答案 0 :(得分:17)
i
的第一个定义是暂定定义(第二个定义也是暂定定义)。它们虽然是“事实上的”定义(定义也作为声明),但没有错误。
引自the Standard:
6.9.2 / 2
具有没有初始化程序的文件范围的对象的标识符声明,以及 没有存储类说明符或存储类说明符静态,构成一个 暂定的定义。如果翻译单元包含一个或多个临时定义 然后,标识符和转换单元不包含该标识符的外部定义 行为就像翻译单元包含该文件范围声明一样 标识符,具有复制类型,如翻译单元的末尾,带有初始化程序 等于0。