变量和常量同名

时间:2015-03-18 18:58:43

标签: c++ c

我有一个C代码片段如下:

const int x = 5;
void main()
{
    int x[x];
    int y = sizeof(x) / sizeof(int);
    printf("%d",y);
}

代码段将被编译并正确运行。但我不明白如何区分x变量'和x' const'。

1 个答案:

答案 0 :(得分:9)

对于C ++,draft C++ standard部分3.3.2 声明点涵盖了这一点:

  

名称的声明点在完成后立即生效   声明者(第8条)和初始化者(如果有的话)之前,除了   如下所述。 [例如:

int x = 12;
{ int x = x; }
     

这里第二个x用它自己的(不确定的)值初始化。    - 例子]

  

[注意:从外部范围开始的名称仍然可见   声明隐藏它的名称。[例如:

const int i = 2;
{ int i[i]; }
     

声明一个包含两个整数的块范围数组。 - 末端示例] - 结束说明   ]

所以在你的情况下:

int x[x];

const int x在结束]之前可见。要在此之后引用 const int x,您可以使用qualified identifer

::x

当然这引出了一个问题,为什么不使用不同的名称而不必处理这些边缘情况呢?

C

draft C99 standard的等效引号来自6.2.1 标识符范围强调我的):

  

结构,联合和枚举标记的范围从一开始就是   在声明了的类型说明符中出现标记之后   标签。每个枚举常量的范围都在此之后开始   枚举器列表中定义的枚举器的外观。的不限   其他标识符具有在完成后立即开始的范围   它的声明者。

  

[...]在内部范围内,标识符指定实体   在内部范围内宣布;在外部范围内声明的实体是   隐藏(并且不可见)在内部范围内。

无法使外部范围中的x在C中可见。

相关问题