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

Posted

技术标签:

【中文标题】我如何告诉 gcc 在 switch/case 语句上警告(或失败)而不中断?【英文标题】:How can I tell gcc to warn (or fail) on switch/case statements without a break? 【发布时间】:2011-10-09 12:03:22 【问题描述】:

我有一个复杂的switch 语句,我忘记在cases 之一的末尾添加break。这是完全合法的,结果我掉到了下一个case

如果我忽略了break 语句,有什么方法可以让 gcc 发出警告(甚至更好,失败)?

我意识到有许多有效的用例(并且我经常在我的代码中使用它们),如 this question 所示,因此显然这样的警告(或失败)需要一个简单的弃权,以便我可以轻松地说, “我确实想在这里跌倒。”

有没有办法告诉 gcc 这样做?

【问题讨论】:

老实说,如果这就是你想要的,我会说不要使用 switch/case。开关/外壳的唯一优点仍然是它很容易掉到你想要的地方。 嘿嘿嘿,C#强制你放break语句,不放就编译不了 只是好奇,我们能看到代码吗?也许有一个更好的解决方案,不需要开关。 @DavidSchwartz:另一个优点是更容易看到并且更容易添加新案例。 现在虽然gcc对该功能的支持仍在进行中,clang has -Wimplicit-fallthrough 【参考方案1】:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7652 上有关于此类功能 (-Wswitch-break) 的讨论。不过好像还没有实现

【讨论】:

看起来它进入了 gcc 7【参考方案2】:

此检查在Cppcheck 中可用,这是一个免费的 C 和 C++ 代码静态分析器。该检查当前标记为“实验性”,因此您需要使用--experimental 命令行开关将其打开。

此检查会针对非空 case 子句发出警告,该子句在没有控制流语句(例如 breakcontinuereturn 等)的情况下进入下一个 case,除非在下一个 case 之前使用 // fall through 等措辞进行评论。

您可以通过查看源代码中的switchFallThroughCase test cases 来了解此处理的构造类型。

【讨论】:

我在 cppcheck-1.83 中找不到这种检查,并且无法使用 --experimental 启用它【参考方案3】:

GCC 7 使用-Wextra-Wimplicit-fallthrough(=[1-5])? 启用警告:https://developers.redhat.com/blog/2017/03/10/wimplicit-fallthrough-in-gcc-7/

【讨论】:

【参考方案4】:

我刚刚浏览了 gcc 选项,但没有任何选项至少会通知您。 有 -Wswitch、-Wswitch-default 和 -Wswitch-enum (http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options),但它们都不适合你。

我最好的选择是使用“else if”语句

【讨论】:

【参考方案5】:

您可以为 grep/perl/emacs/etc 构建一个正则表达式,以查找在 case 之前没有 break 的所有位置。

【讨论】:

【参考方案6】:

简短的回答是否定的,gcc 中没有这样的标志来做到这一点。 Switch case 更常用于跌倒,这就是为什么在 gcc 中使用这样的标志没有意义。

【讨论】:

我觉得有道理,只是不需要默认开启。似乎它可能适合 -Wextra 或 -pedantic。

以上是关于我如何告诉 gcc 在 switch/case 语句上警告(或失败)而不中断?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用带有两个变量的 case/switch 语句吗?

[C]switch...case...一个case包含多个值的一种写法

如何在 Scala 中使用 switch/case(简单模式匹配)?

C语言switch case后如何执行多条命令

第二次实验报告

Java 中 Switch Case 的替代方案