如何在开关盒中正确返回?
假设以下示例:
int main()
{
int value=1;
switch( value )
{
case 1:
{
return 0;
} break;
default:
{
}
}
}
从switch案例中返回不是结构化编程,但大多数开发人员认为提前退出是可接受的偏差(维基参考)
大多数现代编译器都会抱怨这段代码,因为:
9: 'break' 永远不会被执行
然而,删除这break句话会引发这样一个问题:“这是一个失败吗?如果是,为什么[[fallthrough]]没有指定属性?”
显而易见的解决方案是一个假设的[[no_fallthrough]],但我在那个方向没有发现任何东西。
我的问题是:
在这种情况下,适当的方法是什么?
- 应该
switch避免返回内部吗?- 应该
break一直用警告吗?- 应该
break删除并注释指示//[[no_fallthrough]]?- 应该
break删除并且开发人员注意到该return语句与 不兼容break,并且交叉手指没有重构会破坏这一点。
回答
但是,删除中断语句会引发以下问题:“这是失败吗?
触发问题的答案是:不,它不会失败,因为它从函数中返回,从而从函数内部的块中返回。
应该避免返回开关内部吗?
如果您关心严格的结构化编程,那么可以。
但正如你所引用的,大多数人认为这是可以接受的。
应该打破与警告?
我建议不要使用没有效果的控制结构,除非有充分的理由使用它。我认为把它放在这里没有什么好的理由。
应该拆掉
我推荐这个。开发人员应该意识到,return它不会像break,那样失败continue(如果 switch 在循环内),throw并且goto不要。
并且交叉手指没有重构会破坏这一点。
我建议在隐式失败的情况下使用警告,这样您就不必单独依赖交叉手指。
也许更有趣的情况是调用[[noreturn]]函数:
// in some header
[[noreturn]] void fun();
case N:
fun();
// no fall through
我建议至少如图所示进行评论,因为不能假设熟悉每个功能。函数不会在 noreturn 和 non-noreturn 之间切换,但如果发生这种情况,隐式 fallthough 警告也涵盖这种情况。