c++ - 如何处理 -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 类型错误?
解决方案
注意:这个答案是在考虑性能的情况下编写的(如果您不需要它,请忽略它,并在切换后放置一些致命错误)。
我建议使用特定于编译器的功能来标记无法访问的代码。所有主要的编译器都有这样的东西。例如,GCC/Clang/icc 有__builtin_unreachable
,MSVC 有__assume(false)
.
在发布模式下使用这些工具。在调试模式下,将一些致命错误(断言、异常等)放在那里。这样,在开发过程中,您将捕获错误,并且在发布模式下,生成的代码将是高效的。
注意,有一个提案,打算添加std::unreachable()
到 C++ 中。当这有希望通过时,您可以在此类代码中使用它。在那之前,您必须求助于前面提到的特定于编译器的解决方案。
推荐阅读
- jwt - DocuSign 服务集成身份验证使用组织管理员授予对应用程序的同意并模拟所有人
- c# - 修改网站内容并在浏览器中呈现
- html - 你能在 SVG 的一个 defs 标签内定义多个定义吗?
- node.js - 如何在 Nodejs Express 中缓存静态文件 css?
- google-apps-script - 以 PNG 格式保存到云端硬盘的 Google 表格图表的透明背景
- android - 谷歌分析将在 Android Oreo 上崩溃
- android - Android中RecyclerView程序的设计
- javascript - 在 WKWebView 中加载网站后,如何检测元素何时可见?
- hook - 是否有任何钩子可以完成 isc-dhcp-server 中的 DHCPACK
- java - else 没有 if 错误/不是语句。错误是 if 还是可能在整个代码中的某个地方