1

我非常喜欢在 enum-switch-case 中跳过“默认:”标签。因此,当枚举具有未由 switch-case 处理的新值时,我会收到编译器警告。

现在一位同事说,当将一个整数传递给枚举未涵盖的这个 switch-case 时,我会遇到分段错误。

至少我们正在使用的 gcc 可以正确处理它。Visual Studio 文档还说:如果“没有一个常量与 case 标签中的常量匹配并且默认标签不存在 >>> 控制权转移到 switch 语句之后的语句。”

这是标准以及所有(或至少大多数)编译器的行为吗?

4

3 回答 3

3

MS 编译器似乎做得对。这是标准所说的(6.4.2/5):

如果没有与条件匹配的大小写常量,并且如果有default标签,则控制传递到由default标签标记的语句。如果没有 case 匹配并且如果没有,default则不会执行 switch 中的任何语句。

于 2012-11-26T08:47:21.417 回答
1

仅当跳过的大小写破坏了您的代码时,它才会导致分段错误。否则,任何编译器都不应该发出会产生分段错误的代码。

将产生故障的示例:

 switch(flag) {
     case Type1: p = malloc(200); break;
     case Type2: p = malloc(100); break;
 }
 memcpy(p, source, 10);
于 2012-11-26T08:47:02.523 回答
0

[stmt.switch] 状态:

如果没有大小写匹配并且没有默认值,则不会执行 switch 中的任何语句。

所以是的,VS 在这方面遵循标准。

于 2012-11-26T08:48:30.300 回答