如何在开关盒中正确返回?

假设以下示例:

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 警告也涵盖这种情况。


以上是如何在开关盒中正确返回?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>