代码之家  ›  专栏  ›  技术社区  ›  Wayne

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

  •  1
  • Wayne  · 技术社区  · 8 年前
    #include <stdio.h>
    
    int x=3;
    int main()
    {
      int x=4;
      printf("%d",x);
    
      return 0;
    }
    

    正如我们所知,一个地方宣言也可以作为一个全球宣言。自从 x 已全局声明为3,新的全局声明(非暂定)是否会导致重新声明错误,因为在本地声明的情况下不会发生多个非暂定定义的“合并”?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Sourav Ghosh    8 年前

    不,来了 scope .

    这个 x 在…内 main() 具有块范围和覆盖(阴影) 全球的 x 内部 main() .

    相关,引用 C11 第§6.2.1章, “标识符的范围” , ( 我的重点 )

    […]如果一个标识符以相同的名称指定了两个不同的实体: 空间,范围可能重叠。如果是,一个实体的作用域(内部作用域)将结束 严格在其他实体的范围(外部范围)之前。 在内部范围内 标识符指定在内部范围中声明的实体;在外部声明的实体 范围在内部范围内隐藏(不可见)。

        2
  •  2
  •   haccks    8 年前

    正如我们所知道的,一个本地声明就是一个全球声明

    不,那是错的。

    全球的 x 不可见 main 当着当地人的面 x 编译器不会生成C标准允许的任何警告或错误。 变量的范围不同。 x 外面 主要的 它在全球范围内有一段时间 x 内部 主要的