我有一个C代码片段如下:
const int x = 5;
void main()
{
int x[x];
int y = sizeof(x) / sizeof(int);
printf("%d",y);
}
代码片段将被编译并正确运行。但我不明白如何区分 x 'variable' 和 x 'const'。
对于 C++,这包含在C++ 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf部分3.3.2
申报点:
名称的声明点是在其完成之后立即
声明符(第 8 条)及其初始化程序(如果有)之前,除非
下面注明。 [ 例子:
int x = 12;
{ int x = x; }
这里第二个 x 用它自己的(不确定的)值初始化。
—结束示例]
and:
[ 注意:外部作用域中的名称在以下时刻之前仍然可见
隐藏它的名称的声明。[示例:
const int i = 2;
{ int i[i]; }
声明一个包含两个整数的块范围数组。 —结束示例] —结束注释
]
所以在你的情况下:
int x[x];
The 常量整型 x
直到关闭为止都可见]
。可供参考常量整型 x
之后你可以使用合格标识符 http://en.cppreference.com/w/cpp/language/identifiers:
::x
当然,这引出了一个问题,为什么不直接使用不同的名称而不必处理这些边缘情况呢?
C
等效的引号形成C99标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf将来自部分6.2.1
标识符的范围 (强调我的):
结构、联合和枚举标签的范围从
在声明类型说明符中的标签出现之后
标签。每个枚举常量的作用域都从该常量之后开始
其定义枚举数在枚举数列表中的外观。任何
其他标识符的作用域在完成后立即开始
它的声明者。
and:
[...]在内部范围内,标识符指定实体
在内部范围内声明;在外部范围中声明的实体是
隐藏(并且不可见)在内部范围内。
没有办法使x
在 C 中可见的外部范围内。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)