没有默认标签的情况
我非常喜欢在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