gpt4 book ai didi

c++ - 如何处理 -Wreturn-type 以切换 C++11 枚举类?

转载 作者:行者123 更新时间:2023-11-30 02:17:42 25 4
gpt4 key购买 nike

如果我有一个基于切换 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) 用 pragma 抑制警告,但我不会防范有人传入 static_cast<Test>(123) .

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

最佳答案

通常我会在开关之后放置一些东西,无论是throw something() 还是return -1。您需要确保在运行时,无论发生什么情况,对该函数的调用至少是安全的。您的编译器告诉您的也是如此。

例子:

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;
}

throw std::runtime_error("Unhandled Test enumerator " + std::to_string((int)test) + " in foo()");
}

理想情况下,您的客户永远不会看到这一点,但如果他们看到了(通过您的顶级 catch — 您有一个,对吧?),您会立即知道问题所在并可以解决

此外(但不仅仅是)我会考虑放置一个调试断言,如 assert(或特定于项目的等效项),以便在开发过程中检测到此错误。 (不过,在上面使用 try 的示例中,这实际上会阻止生成有用的错误消息,因此它并不总是合适的。)

此外,如果您打开 -Werror 然后无法将项目添加到 switch,您的项目将不会构建,以便从源头解决问题(字面意思!)。

一般来说,不要忽略或试图抑制警告:留意它们!

关于c++ - 如何处理 -Wreturn-type 以切换 C++11 枚举类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53282722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com