如何在切换条件下使用枚举

时间:2014-05-05 04:59:21

标签: c++

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

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"
}

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

5 个答案:

答案 0 :(得分:6)

您错过了case关键字:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你忘了写案例

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

通用开关类似于:

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

答案 3 :(得分:0)

你忘了那里的情况..

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

答案 4 :(得分:0)

好的,其他人已回答您错过了case关键字。但是,没有解释的是原始代码编译的原因。这是因为没有case关键字,它被视为goto标签。事实上,这编译:

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

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