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

Jam*_*mes 4 c++ switch-statement

我继承了一个非常古老(超过 15 年)的 C++ 程序,该程序当前使用 IBM 的 xlc 编译器在 AIX 上运行。我遇到了一个 switch 语句,但我不明白它是如何工作的。

\n

下面是一个显示这种情况的最小示例。

\n
#include <iostream>\nusing namespace std;\n\nint main()\n{\n        int i=5;\n\n        switch( i ) {\n                case 1:\n                        cout << "case " << i << endl;\n                        break;\n                case 2:\n                        cout << "case " << i << endl;\n                        break;\n                Otherwise:\n                        cout << "case " << i << endl;\n                        break;\n        }\n        cout << "bye\\n";\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在 Amazon Linux 2 上使用 GCC 7.3.1。该程序编译良好并显示以下输出:

\n
bye\n
Run Code Online (Sandbox Code Playgroud)\n

如果我添加“-Wall”,那么它会告诉我以下内容:

\n
minex.C: In function \xe2\x80\x98int main()\xe2\x80\x99:\nminex.C:15:3: warning: label \xe2\x80\x98Otherwise\xe2\x80\x99 defined but not used [-Wunused-label]\n   Otherwise:\n   ^~~~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n

问题:

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

    \n
  2. \n
  3. case 标签是否必须遵循“case n:”形式,其中 n 是整数表达式或“default:”(或常量字符串表达式,但这在这里似乎不相关?

    \n
  4. \n
  5. 有人可以给我指出一个参考资料,说明这是\n应该被允许的吗?

    \n
  6. \n
\n

dbu*_*ush 8

标签可以出现在任何语句上。该语句恰好位于switch块内并不重要。该标签可以从当前函数内的任何位置跳转到。

\n

标签caseordefault只能出现在 a 内部switch,但这并不能阻止其他标签也出现在那里。

\n

C++17 标准的第 9.1 节描述了带标签的语句:

\n
\n

1语句可以被标记。

\n

标记语句:

\n

attribute-specifier-seq opt标识符 : 语句

\n

属性说明符序列opt case常量表达式 :\n语句

\n

attribute-specifier-seq opt 默认值:声明

\n

可选的attribute-specifier-seq属于标签。标识符标签声明标识符。标识符标签的唯一用途是作为 的目标goto。标签的范围是它出现的函数。不得在函数内重新声明\n标签。goto可以在声明之前的语句中使用标签。标签有自己的名称空间,并且不干扰\n其他标识符。[ 注意:标签可能与同一作用域中的其他声明或封闭作用域中的模板参数具有相同的名称。非限定名称查找 (6.4.1) 会忽略标签。\xe2\x80\x94 结束\n注]

\n

2 case 标签和default 标签只能出现在switch 语句中

\n
\n

请注意,有case和的限制default,但没有其他标签。

\n