繁体   English   中英

不寻常的 switch 语句 label - 为什么这不是语法错误?

[英]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:
   ^~~~~~~~~

问题:

  1. 为什么这不是语法错误?

  2. 案例标签是否必须遵循“案例 n:”形式,其中 n 是 integer 表达式或“默认值:”(或常量字符串表达式,但这在这里似乎不相关?

  3. 有人可以指出我应该允许这样做的参考吗?

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 语句中

请注意, casedefault有限制,但其他标签没有限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM