没有默认标签的情况

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

现在有个同事说,当把一个整数传递给这个没有被枚举所涵盖的开关情况时,我会得到一个分段错误。

至少我们正在使用的gcc正确处理它。 另外Visual Studio文档说:如果“没有任何常量匹配案例标签中的常量并且不存在默认标签>>>在switch语句之后,将控件传输到语句。”

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


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

如果没有大小写常量与条件匹配,并且存在default标签,则控制权传递给由default标签标记的语句。 如果没有大小写匹配,并且没有default那么交换机中没有任何语句被执行。


只有在跳过的情况下破坏您的代码才会导致分段错误。 否则,编译器不应该发出会产生分段错误的代码。

会产生故障的示例:

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

[stmt.switch]指出:

如果没有大小写匹配,并且没有默认值,那么交换机中没有任何语句被执行。

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

链接地址: http://www.djcxy.com/p/84433.html

上一篇: Case without default label

下一篇: C++ Switch Statement Case Error