dfr*_*ese 0 c++ gcc gcc-warning clang++
我有一些 C++ 代码,我可以在其中切换枚举中的值。我试图用 -Wall -Wextra -Werror 编译它。这在使用 clang 时很好。但是,GCC 抱怨未涵盖默认代码路径。简化版本如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过在函数末尾添加一个 default case 或另一个 return 语句来处理这个问题。但是,我的问题是为什么 GCC 没有检测到枚举的所有情况都已涵盖?或者换一种说法,海湾合作委员会在这里抱怨是否有正当理由?
我在此处对编译器输出进行了比较。
因为没有涵盖所有情况。
可以分配给定义中val未命名的值Types。枚举并不限制于仅仅这些值。
some_logic((Types)3); // whoops
Run Code Online (Sandbox Code Playgroud)
如果您真的、正确地确定some_logic只会提供您在Types定义中命名的值,或者希望将其他情况视为“异常”前提条件违规,那很好,但您仍然需要告诉计算机。
关于最佳方法的意见各不相同,但在这种情况下,我会省略default(这样如果您稍后添加Types并忘记更新,您仍然会收到编译器警告switch)但throw之后简单地说:
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");
}
Run Code Online (Sandbox Code Playgroud)
在没有任何更强的要求的情况下。
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |