为什么此代码中没有重新声明错误?

时间:2016-11-04 14:21:50

标签: c syntax scope declaration

#include <stdio.h>

int x=3;
int main()
{
  int x=4;
  printf("%d",x);

  return 0;
}

正如我们所知,地方宣言也是一个全球宣言。由于x已经全局声明为3,因此新的全局声明(非暂定)不会导致重新声明错误,因为不会发生多个非暂定定义的“合并”当地声明?

2 个答案:

答案 0 :(得分:4)

不,这是scope

x内的main()具有块范围,并覆盖(阴影)x内的全局 main()

相关,引用C11,章节§6.2.1,“标识符范围”,(强调我的

  

[...]如果标识符指定同名的两个不同实体   空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将结束   严格地在另一个实体的范围之前(外部范围)。 在内部范围内,   identifier指定在内部作用域中声明的实体;在外部宣布的实体   范围在内部范围内隐藏(并且不可见)。

答案 1 :(得分:2)

  

正如我们所知,本地声明充当全球声明

没有。那是错的。

x存在的情况下,main无法看到全局x。编译器不会生成C标准允许的任何警告或错误。 变量的范围是不同的。 x之外的main具有全局范围,而x内的main具有功能范围。