为什么 gcc 没有检测到所有处理的枚举值?
Why doesn't gcc detect all enum vals handled?
我有一些C 代码,其中我在枚举中切换值。我试图用-wall -wextra -werror编译。使用clang时,这很好。但是,海湾合作委员会抱怨说未涵盖默认的代码路径。简化版本看起来如下:
enum class Types: int {
A,
B,
C
};
bool some_logic(Types val) {
switch (val) {
case Types::A:
return (false);
case Types::B:
return (true);
case Types::C:
return (false);
}
}
我可以通过在功能末尾添加默认情况或另一个返回语句来处理此问题。但是,我的问题是为什么海湾合作委员会不检测到所有枚举的所有案例均被涵盖?或用不同的措辞,是否有合理的理由在这里抱怨?
我在这里对编译器输出进行了比较。
,因为所有情况均未覆盖。
可以将val
分配给Types
定义中未命名的值。枚举不仅限于
some_logic((Types)3); // whoops
如果您真的正确确定some_logic
只能在Types
定义中提供的值,或者希望将其他情况视为"特殊"的前提条件违规,这很好,但是您仍然需要告诉计算机。
意见因最佳方法而异,但是在这种情况下,我会忽略default
(如果您以后添加到Types
并忘记更新switch
,则仍然会收到编译器警告(,但是随后将一个简单的 throw
plonke:
bool some_logic(const Types val)
{
switch (val) {
case Types::A:
return (false);
case Types::B:
return (true);
case Types::C:
return (false);
}
throw std::runtime_error("Didn't expect that innit");
}
在没有任何更强要求的情况下。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 对clang、gcc和icc中开关枚举类返回的处理一致
- 为什么 gcc 没有检测到所有处理的枚举值?
- C++ 使用枚举进行错误处理
- C++异常处理和枚举作用域
- c++警告:枚举值未在开关[-Wswitch]中处理
- switch()中未处理的枚举类值-异常或断言
- 使用BOOST _PP_SEQ_FOREACH _R递归处理枚举
- "control reaches end of non-void function",通过枚举类型进行完全处理的案例切换
- 将c++代码从MS Visual Studio移植到Linux,并处理类型化枚举
- 编译时断言,当并非所有枚举值都在 C++ 的 switch 语句中处理时