我如何告诉gcc在switch/case语句上警告(或失败)而不中断?

How can I tell gcc to warn (or fail) on switch/case statements without a break?

本文关键字:失败 中断 警告 gcc 何告诉 switch 语句 case      更新时间:2023-10-16

我有一个复杂的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子句,该子句在没有控制流语句(如breakcontinuereturn等)的情况下跳转到下一个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中使用这样一个标志没有意义的原因。