我很喜欢在enum-switch-case中跳过“default:”标签。所以我得到编译器警告,当枚举有一个新的值,而不是由switch-case处理。
现在一位同事说,当一个整数传递给这个未被枚举覆盖的switch-case时,我会得到一个分段错误。
至少我们使用的gcc正确处理它。此外,Visual Studio documentation表示:如果“没有任何常量与案例标签中的常量匹配且默认标签不存在>>>控制权转移到switch语句后的语句。”
这是标准,因此是所有(或至少是最多)编译器的行为吗?
答案 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在这方面遵循标准。