我有一个C代码片段如下:
const int x = 5;
void main()
{
int x[x];
int y = sizeof(x) / sizeof(int);
printf("%d",y);
}
Run Code Online (Sandbox Code Playgroud)
代码片段将被编译并正确运行.但我不明白如何区分x'变量'和x'常量'.
对于C++,这在C++标准草案部分3.3.2 的声明中有所涉及:
声明的声明就在其完整的声明者(第8条)之后和初始化者(如果有的话)之前,除非如下所述.[例如:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化. - 末端的例子]
和:
[注意:外部作用域中的名称在隐藏它的名称声明之前仍然可见.[示例:
Run Code Online (Sandbox Code Playgroud)const int i = 2; { int i[i]; }声明一个包含两个整数的块范围数组. - 末端示例] - 尾注]
所以在你的情况下:
int x[x];
Run Code Online (Sandbox Code Playgroud)
该const int的 x是直至收盘可见].要在该点之后引用const int x,您可以使用限定标识符:
::x
Run Code Online (Sandbox Code Playgroud)
当然这引出了一个问题,为什么不只是使用不同的名称而不必处理这些边缘情况?
C
C99标准草案中的等效引号来自6.2.1 标识符范围(强调我的):
结构,联合和枚举标记具有在声明标记的类型说明符中标记出现之后开始的范围.每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围.任何其他标识符的范围都在其声明者完成之后开始.
和:
[...]在内部范围内,标识符指定在内部范围内声明的实体; 在外部作用域中声明的实体在内部作用域内隐藏(并且不可见).
没有办法使x外部范围在C中可见.