【问题标题】:Switch statement with automatic break at each case step in C++在 C++ 中的每个 case 步骤中具有自动中断的 switch 语句
【发布时间】:2015-06-29 14:56:48
【问题描述】:

如果我们想要一个 switch 语句,对于每种情况我们需要运行一些指令然后 break 我们会这样:

switch (condition) {
   case (opt1):
      // do stuff
      break;
   case (opt2):
      // do stuff
      break;
   case (opt3):  
      // do stuff
      break;
   // ...
   default:
      // do stuff
}

是否有可能有一个排他开关,而不会失败,默认情况下每个选项都应该中断并且不必显式声明中断指令?如果不是在 C++ 中,是否知道其他命令式语言中是否有这样的功能?

【问题讨论】:

  • 没有像switch statements were designed to allow fallthrough这样的流控。如果你想避免break,你可以使用if/else if/else(以轻微的性能损失为代价)
  • 要做到这一点,您必须消除跌倒,您为什么要这样做?这个功能太方便了。
  • 我可能想要 swich 语句的那种派生形式,以提高代码的可读性,比如说行空间。作为扩展语言功能。
  • @Vee6 any idea if such a feature is available in other imperative languages? Pascal / Delphi

标签: c++ switch-statement


【解决方案1】:

C# 也需要break,但如果你不放它就会对你大喊大叫。您需要goto label; 才能明确通过。

在 C++ 中,本机无法做到这一点(当然,除了可怕的宏)。但是,Clang 有 -Wimplicit-fallthrough 警告。然后,您可以插入 [[clang::fallthrough]]; 以消除故意失败的警告。

文档:http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough

【讨论】:

    【解决方案2】:

    我讨厌在我的 switch 中使用 break 语句,所以我使用将 switch 包装在闭包中并从每个 case 返回的模式。例如:

    auto result = [&] {
      switch(enum_val) {
        case A:
          return Foo();
        case B:
          return Bar();
      }
    }();
    

    【讨论】:

      【解决方案3】:

      Golang 中“没有自动掉线”。 https://golang.org/doc/effective_go.html#switch

      【讨论】:

        猜你喜欢
        • 2016-01-18
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 2013-09-24
        • 2022-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多