如何告诉gcc在switch/case语句中没有break时发出警告(或失败)?

10

我有一个复杂的switch语句,并且我忘记在其中一个case结尾处放置了break语句。这是完全合法的,结果导致我向下执行到下一个case

是否有任何方法可以让gcc警告(或者更好的是,失败),如果我忽略了放置break语句?

我意识到有很多有效的用例(我经常在我的代码中使用它们),就像在这个问题中所展示的一样,因此显然这样的警告(或者失败)需要一个简单的豁免条款,以便我可以轻松地说,“我确实想要在这里执行下去。”

是否有任何方法可以告诉gcc这样做?


呵呵呵,C# 强制你放置 break 语句,如果不放置就无法编译。 - BlackBear
只是好奇,我们能看到代码吗?也许有一个更好的解决方案,不需要使用开关。 - fredoverflow
1
@DavidSchwartz:另一个优点是更加舒适,更容易添加新的情况。 - Nathan Fellman
@FredOverflow:我认为企业安全不会喜欢那个想法 :-) - Nathan Fellman
1
现在虽然gcc对这个特性的支持仍在进行中,但是clang有-Wimplicit-fallthrough - Shafik Yaghmour
显示剩余2条评论
6个回答

6

似乎在gcc 7中已经解决了。 - smichak

4
该检查可在免费的C和C++代码静态分析器Cppcheck中使用。该检查目前被标记为"实验性",因此您需要使用--experimental命令行开关来启用它。
此检查警告非空的case子句,如果它连续到下一个case而没有控制流语句(例如breakcontinuereturn等),除非在下一个case之前有一个注释,其中包含类似于// fall through的措辞。
您可以通过查看源代码中switchFallThroughCase测试用例来了解此处理的构造类型。

1
我已经找不到cppcheck-1.83中这种检查了,并且无法使用--experimental启用它。 - Andy

3

2

1
您可以构建一个正则表达式,用于在grep/perl/emacs等中查找所有没有在case之前有break的地方。

0

简短的回答是否定的,gcc中没有这样的标志来实现。Switch case通常用于fall through,因此在gcc中使用这样的标志是没有意义的。


2
我认为这很有道理,只是它不需要默认启用。似乎将其应用于-Wextra或-pedantic可能更合适。 - Jason Dagit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接