没有默认标签的开关案例中的无效值
Invalid values in Switch-Case without default label
我非常喜欢在枚举开关案例中跳过"默认:"标签。所以我收到编译器警告,当枚举有一个新值时,开关大小写不处理。
现在一位同事说,当将一个整数传递给枚举未涵盖的开关情况时,我会得到一个分段错误。
至少我们使用的 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在这方面遵循标准。
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 为什么这个案例陈述需要一个"if else"而不仅仅是一个"if"?
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- 没有默认标签的开关案例中的无效值