为什么 gcc 没有检测到所有处理的枚举值?

Why doesn't gcc detect all enum vals handled?

本文关键字:枚举 处理 gcc 检测 为什么      更新时间:2023-10-16

我有一些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");
}

在没有任何更强要求的情况下。