[英]unusual switch statement label - why isn't this a syntax error?
我继承了一个非常古老(+15 岁)的 C++ 程序,该程序目前使用 IBM 的 xlc 编译器在 AIX 上运行。 我遇到了一个 switch 语句,但我不明白它是如何工作的。
下面是一个显示这种情况的最小示例。
#include <iostream>
using namespace std;
int main()
{
int i=5;
switch( i ) {
case 1:
cout << "case " << i << endl;
break;
case 2:
cout << "case " << i << endl;
break;
Otherwise:
cout << "case " << i << endl;
break;
}
cout << "bye\n";
}
我在 Amazon Linux 上使用 GCC 7.3.1 2. 程序编译良好并显示此 output 是:
bye
如果我添加“-Wall”,那么它会告诉我以下内容:
minex.C: In function ‘int main()’:
minex.C:15:3: warning: label ‘Otherwise’ defined but not used [-Wunused-label]
Otherwise:
^~~~~~~~~
问题:
为什么这不是语法错误?
案例标签是否必须遵循“案例 n:”形式,其中 n 是 integer 表达式或“默认值:”(或常量字符串表达式,但这在这里似乎不相关?
有人可以指出我应该允许这样做的参考吗?
label 可以出现在任何语句上。 该语句恰好位于switch
块内并不重要。 这个 label 可以从当前 function 内部的任何地方跳转到。
case
label 或default
只能出现在switch
内部,但这并不妨碍其他标签也出现在那里。
C++17 标准的第 9.1 节描述了标记语句:
1可以标记语句。
标记语句:
属性说明符序列选择标识符:语句
属性说明符序列选择案例常量表达式:语句
属性说明符序列选择默认值:声明
可选的属性说明符序列属于 label。 标识符 label 声明了该标识符。 标识符 label 的唯一用途是作为
goto
的目标。 label 的 scope 是其中出现的 function。 标签不得在 function 中重新声明。 label 可以在声明之前的goto
语句中使用。 标签有自己的名称空间,不会干扰其他标识符。 [注意:label 可能与同一 scope 中的另一个声明或来自封闭 scope 的模板参数具有相同的名称。 不合格名称查找 (6.4.1) 会忽略标签。 ——尾注]2 案例标签和默认标签应仅出现在 switch 语句中
请注意, case
和default
有限制,但其他标签没有限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.