Switch-Case中的值无效,没有默认标签

时间:2012-11-26 08:43:37

标签: c++ switch-statement

我很喜欢在enum-switch-case中跳过“default:”标签。所以我得到编译器警告,当枚举有一个新的值,而不是由switch-case处理。

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

至少我们使用的gcc正确处理它。此外,Visual Studio documentation表示:如果“没有任何常量与案例标签中的常量匹配且默认标签不存在>>>控制权转移到switch语句后的语句。”

这是标准,因此是所有(或至少是最多)编译器的行为吗?

3 个答案:

答案 0 :(得分:2)

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

  

如果没有大小写常量匹配条件,并且如果有default标签,则控制   传递到default标签标注的声明。如果没有大小写匹配且没有default则不会执行交换机中的任何语句。

答案 1 :(得分:1)

只有在跳过大小写破坏代码时才会导致分段错误。否则,编译器不应发出会产生分段错误的代码。

将产生错误的示例:

 switch(flag) {
     case Type1: p = malloc(200); break;
     case Type2: p = malloc(100); break;
 }
 memcpy(p, source, 10);

答案 2 :(得分:0)

[stmt.switch]声明:

  

如果没有案例匹配,如果没有默认值则没有   执行开关中的语句。

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