【问题标题】:how to use enum inside a switch condition如何在切换条件中使用枚举
【发布时间】:2014-05-05 04:59:21
【问题描述】:

以下代码使用带枚举的开关。主程序正确地将参数传递给函数,但没有执行正确的开关行。你能告诉它为什么没有进入开关条件吗?

enum MyEnum {
    Enum1    = 1,
    Enum2    = 0x0D
};

bool compute(MyEnum code) {
  switch(code) {
     Enum1:  return true;
     Enum2:  return false;
  };
  cout << "why here??" << endl; // this line is getting printed for both inputs
  return false;
}
int main() {
    cout << "compack=" << compute((MyEnum)1) << endl; // printed "0"
    cout << "compack=" << compute((MyEnum)13) << endl; // printed "0"
}

我检查了与开关和枚举相关的其他问题(例如3019153),但无法找出错误。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您缺少case 关键字:

    switch(code) {
     case Enum1:  return true;
     case Enum2:  return false;
    };
    

    【讨论】:

    • 哇,编译器甚至没有抱怨?非常感谢。
    • @R71 它可能不会因为两个因素而抱怨:第一:foo: 只是一个标签(例如,您可以使用goto foo; 跳转到该标签。)第二:您是可能没有使用 -Wall 标志(它显示一些有用的警告):` ▶ g++ -Wall switch.cpp -o 1 switch.cpp: In function 'int main()': switch.cpp:7:9: warning: label ' foo' 已定义但未使用 [-Wunused-label] foo: return 1; ^`
    【解决方案2】:
    switch(code) 
    {
         case Enum1:  return true;
         case Enum2:  return false;
    };
    

    【讨论】:

      【解决方案3】:

      你忘了写case

      switch(code)
      {
          case Enum1: return true;
          case Enum2: return false;
      };
      

      通用开关是这样的:

      switch(var)
      {
          case val1:
              foo();
              break;
          case val2:
              bar();
              break;
          default:
              error();
      };
      

      【讨论】:

        【解决方案4】:

        你把箱子忘在那里了..

        switch(code)
         {
          case Enum1: 
                     //do something  
                     break;
          case Enum2:
                    //do something 
                     break;
         };
        

        【讨论】:

          【解决方案5】:

          好的,所以其他人回答说您缺少 case 关键字。但是,尚未解释的是为什么要编译原始代码。那是因为没有case 关键字,它被视为goto 标签。事实上,这样编译:

          switch (i) {
              if (j == 3) {
                  case 1:;
                  L1:;
              } else {
                  goto L1;
                  case 2:;
              }
          }
          

          请注意,j==3 实际上是死代码。它永远无法执行。有关此功能的实际有用应用,请参阅Duff's device。顺便说一句,启用完整警告的编译会警告您未使用的 goto 标签,至少使用 g++clang++ (-Wall -Wextra -pedantic)。

          【讨论】:

            猜你喜欢
            • 2020-08-09
            • 2011-10-28
            • 1970-01-01
            • 1970-01-01
            • 2014-04-01
            • 1970-01-01
            • 2014-11-10
            • 2012-09-28
            • 1970-01-01
            相关资源
            最近更新 更多