我如何告诉 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
语句,我忘记在case
s 之一的末尾添加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 子句发出警告,该子句在没有控制流语句(例如 break
、continue
、return
等)的情况下进入下一个 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 语句上警告(或失败)而不中断?的主要内容,如果未能解决你的问题,请参考以下文章
[C]switch...case...一个case包含多个值的一种写法