一个无故障的开关/箱子是否可行?

时间:2016-12-06 12:10:36

标签: c++ switch-statement break auto

是否建议使用switch的语法始终不需要breaks

我的建议是在auto和每个案例之前插入switch

auto switch(expr) {
  auto case 1: statement; statement;
  auto case 2: statement; statement;
  default: statement; statement;
}

等同于

switch(expr) {
  case 1: statement; statement; break;
  case 2: statement; statement; break;
  default: statement; statement;
}

编译器会抱怨错误

  • 如果在auto switch任何case中没有auto
  • 如果在auto case中使用auto - 少switch

是否有任何解析器问题,任何歧义?

用户的错误使用错误是否还有其他好处,例如更好的优化可能性?

更新

稍微有用的情况是休息的位置不是那么清楚:

case(expr) {
  case 1:
      if(isThisTrue) {
        print(that);
      } else {
        break;
      }
      doSomethingElse();
      if(!isThisTrue) {
        break;
      }

......或类似的东西。

我认为预防堕落有助于防止一些难以诊断的错误。

1 个答案:

答案 0 :(得分:2)

由于很多原因,这不是一件好事!

  • 最明显的是:它不会保存任何时间totype auto 而不是 break

  • 它的可读性差得多。就像没有人会建议使用goto一样,你的命题很难让decypher。想象一个长的 case 块,读者在整个读取块时必须记住这个auto关键字。除非你使用了很多goto,否则c ++阅读起来很愉快,因为你不必经常在代码中上下。

  • 案例陈述可能不会系统地破坏,如果我选择添加一个跳过休息的条件,你的 auto 很可能会在编译时被遗忘并烦扰我。

  • auto 已经意味着什么。在一种语言中添加新的关键字可能很烦人,但重新使用一些具有不同含义的关键字却很糟糕!

最后回答你的问题:不,这不会导致任何解析问题。只需将auto case[...]auto替换为case[...]break即可。实际上,您可以定义自己的宏来做到这一点!通过这样做,你可能会意识到为什么没有必要。

类似的东西:

#define AUTO(x) x break;
switch(i){
case 1: std::cout<<1;
AUTO case 2: std::cout<<2;
AUTO default: std::cout<<i
}

注意:这个宏有点扭曲你的观点,我知道。绝对是一种方法,可以更接近您的想法,我会考虑并在有空的时候进行更新。

相关问题