我如何告诉gcc在switch/case语句上警告(或失败)而不中断?
How can I tell gcc to warn (or fail) on switch/case statements without a break?
我有一个复杂的switch
语句,我忘了在其中一个case
语句的末尾放一个break
。这是相当合法的,因此我有了下一个case
。
如果我忽略放置break
语句,是否有任何方法可以让gcc警告(甚至更好,失败)?
我意识到有很多有效的用例(我经常在我的代码中使用它们),就像这个问题中的例子一样,所以很明显,这样的警告(或失败)需要一个简单的放弃,这样我就可以很容易地说,"我确实想在这里失败。"
是否有办法告诉gcc这样做?
在http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7652上有一个关于这种特性的讨论(- switch-break)。但它似乎还没有实现
此检查可在Cppcheck中使用,Cppcheck是C和c++代码的免费静态分析器。检查目前被标记为"实验",所以你需要使用--experimental
命令行开关来打开它。
此检查警告非空case子句,该子句在没有控制流语句(如break
、continue
、return
等)的情况下跳转到下一个case,除非在下一个case
之前有类似// fall through
的注释。
您可以通过查看源代码中的switchFallThroughCase
测试用例来了解这种处理的构造类型。
GCC 7在-Wextra
或-Wimplicit-fallthrough(=[1-5])?
中启用了警告:https://developers.redhat.com/blog/2017/03/10/wimplicit-fallthrough-in-gcc-7/
我刚刚检查了gcc选项,没有一个至少会给您一个通知。有-Wswitch, -Wswitch-default和-Wswitch-enum (http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options),但是它们都不能为你工作。
我最好使用'else if'语句
您可以为grep/perl/emacs/etc构建regexp来查找case
之前没有break
的所有位置
简短的回答是不,在gcc中没有这样的标志来做这件事。Switch case通常用于失败,这就是为什么在gcc中使用这样一个标志没有意义的原因。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 我如何告诉gcc在switch/case语句上警告(或失败)而不中断?
- 断点安装失败:中断失败