如何用if语句替换预处理器宏?

时间:2014-10-09 06:50:11

标签: c++ if-statement c-preprocessor

通常,预处理器宏用于控制某些要编译的代码组。这是一个例子。

#define ENABLE 1

void testswitch(int type){

    switch(type){
    case 1:
        std::cout << "the value is 1" << endl;
        break;
    case 2:
        std::cout << "the value is 2" << endl;
        break;
#ifdef ENABLE
    case 3:
        std::cout << "the value is 3" << endl;
        break;
    case 4:
        std::cout << "the value is 4" << endl;
    }
#endif
    }
}

现在我想删除所有这些预处理器宏并用if条件

替换它们
void testswitch(int type, bool enable){
    switch(type){
    case 1:
        std::cout << "the value is 1" << endl;
        break;
    case 2:
        std::cout << "the value is 2" << endl;
        break;
    if (enable) {
    case 3:
        std::cout << "the value is 3" << endl;
        break;
    case 4:
        std::cout << "the value is 4" << endl;
    }
    }
}

但是,上述代码并没有与以前相同的逻辑。无论变量enabletrue还是falsecase 3case 4始终都是启用的。这些代码在VS2010下进行测试。

Q1:编译器是否忽略if条件?

为了实现我的目标,我必须更改以下代码:

void testswitch(int type, bool enable){
    switch(type){
    case 1:
        std::cout << "the value is 1" << endl;
        break;
    case 2:
        std::cout << "the value is 2" << endl;
        break;
    case 3:
        if (enable) 
            std::cout << "the value is 3" << endl;
        break;
    case 4:
        if (enable) 
            std::cout << "the value is 4" << endl;
    }
}

但似乎代码中存在冗余if有没有更好的方法呢?

3 个答案:

答案 0 :(得分:2)

编译器不会忽略if条件。但您必须记住,case标签是标签。 switch只是goto更有条理的方法。由于goto可以跳转到由if(或循环或其他任何其他)控制的块中,所以switch也可以。{/ p>

您可以将enable - 只包含在一个单独的开关中:

void testswitch(int type, bool enable) {
  switch(type) {
  case 1:
    std::cout << "the value is 1" << endl;
    break;
  case 2:
    std::cout << "the value is 2" << endl;
    break;
  default:
    if (enable) {
      switch(type) {
      case 3:
        std::cout << "the value is 3" << endl;
        break;
      case 4:
        std::cout << "the value is 4" << endl;
        break;
      }
    }
    break;
  }
}

答案 1 :(得分:1)

另一个解决方案是将其重构为两个switch语句,第二个语句由if (enable)控制:

void testswitch(int type, bool enable) {
    switch(type) {
        case 1:
            std::cout << "the value is 1" << endl;
            break;
        case 2:
            std::cout << "the value is 2" << endl;
            break;
        default:
            break;
    }
    if (enable) {
        switch(type) {
            case 3:
                std::cout << "the value is 3" << endl;
                break;
            case 4:
                std::cout << "the value is 4" << endl;
                break;
            default:
                break;
        }
    }
}

答案 2 :(得分:0)

如果enable是一个常量(或者在编译时已知),一个相当聪明的编译器(如gcc)将不会生成代码来检查enable的值,但不会生成代码(如果已知它是假的)或者生成then语句。