没有默认标签的开关案例中的无效值

Invalid values in Switch-Case without default label

本文关键字:无效 案例 开关 默认 标签      更新时间:2023-10-16

我非常喜欢在枚举开关案例中跳过"默认:"标签。所以我收到编译器警告,当枚举有一个新值时,开关大小写不处理。

现在一位同事说,当将一个整数传递给枚举未涵盖的开关情况时,我会得到一个分段错误。

至少我们使用的 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在这方面遵循标准。