我有一个C代码片段如下:
const int x = 5;
void main()
{
int x[x];
int y = sizeof(x) / sizeof(int);
printf("%d",y);
}
代码段将被编译并正确运行。但我不明白如何区分x变量'和x' const'。
答案 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中可见。