首页 > 解决方案 > 如何处理 -Wreturn-type 以切换 C++11 枚举类?

问题描述

如果我有一个基于切换 a 返回的函数enum class,gcc 会发出warning: control reaches end of non-void function [-Wreturn-type]. 示例代码:

enum class Test { a, b, c } ;

int foo(Test test) {
    switch (test) {
        case Test::a: return 0;
        case Test::b: return 1;
        case Test::c: return 2;
    }
}

我想到了两种解决方案,但似乎都不正确:

1)有一个默认情况下抛出。但是,当我向其中添加其他成员时,enum class我不再收到我错过了一个案例的错误。

2)用编译指示抑制警告,但我不防备有人传入static_cast<Test>(123).

所以我的问题是,如何处理切换 C++11 枚举类的 -Wreturn 类型错误?

标签: c++enumsgcc-warning

解决方案


注意:这个答案是在考虑性能的情况下编写的(如果您不需要它,请忽略它,并在切换后放置一些致命错误)。

我建议使用特定于编译器的功能来标记无法访问的代码。所有主要的编译器都有这样的东西。例如,GCC/Clang/icc 有__builtin_unreachable,MSVC 有__assume(false).

在发布模式下使用这些工具。在调试模式下,将一些致命错误(断言、异常等)放在那里。这样,在开发过程中,您将捕获错误,并且在发布模式下,生成的代码将是高效的。

注意,有一个提案,打算添加std::unreachable()到 C++ 中。当这有希望通过时,您可以在此类代码中使用它。在那之前,您必须求助于前面提到的特定于编译器的解决方案。


推荐阅读