#ifdef中的switch语句错误?

时间:2009-01-20 09:43:49

标签: c++ macros switch-statement

我有一些看起来像这样的代码:

someFunc(value)
{

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}

定义SOMEMACRO,假设值为4 ..为什么跳过案例4和5而返回FALSE? :(

是因为我没有默认情况,或者我不允许在switch语句中使用ifdef?

9 个答案:

答案 0 :(得分:8)

尝试以下方法:

someFunc(value)
{
  switch(value){
    case 1:
    case 2:
    case 3:
#ifdef SOMEMACRO
#error macro is defined
    case 4:
    case 5:
#else
#error macro is not defined
#endif
       return TRUE;
  }
  return FALSE;
}

编译它,看看编译器给你的两个错误中的哪一个。

答案 1 :(得分:3)

您没有指定您正在使用的编译器/预编译器,但大多数都有保留预处理器结果的选项 - 我要检查的第一件事就是在那里生成的内容。

不可否认,我更愿意维护看起来更像这样的代码:

    someFunc(value)
    {
        switch(value){
            case 1:
            case 2:
            case 3:
                return TRUE;
#ifdef SOMEMACRO
            // Special build for SOMEMACRO Inc.
            case 4:
            case 5:
                return TRUE;
#endif
            default:
                return FALSE;
        }
    }

答案 2 :(得分:2)

根据您的编译器,您应该有一种方法来阅读和检查预处理的代码。通过这种方式,您无需从远处猜测和捅它,并且可以看到您要求编译器编译的确切代码。使用gcc,the relevant option is -E

答案 3 :(得分:2)

“开关”没有损坏

to,或多或少,引用The Pragmatic Programmer

继续前往其他地方寻找错误。要说服自己在someFunc中添加value = 4#define SOMEMACRO

进行干净的构建以确保每个依赖都得到解决。

答案 4 :(得分:1)

您确定在定义SOMEMACRO之后编译了您的模块吗?

答案 5 :(得分:0)

为什么不在默认情况下输入“return false”?

答案 6 :(得分:0)

您的假设中的某些内容不正确,请更改代码并从那里开始向后工作。

#define SOMEMACRO 1

someFunc(value)
{

    value = 4;

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}

如果这不能恢复,你就会遇到真正的问题。

答案 7 :(得分:0)

其他人已经指定了如何检查是否定义了宏。

如果构建系统正在定义宏,那么找到它的好方法是:将构建输出传递给grep(或类似的文本搜索工具)以搜索宏定义(类似于:make | grep "-DSOMEMACRO")。

如果您的系统上没有grep;将构建输出重定向到文件并在文本编辑器中打开它,以使用文本搜索手动检查。)

答案 8 :(得分:0)

与其他人一样,我认为你的一个假设必定是不正确的。您没有说明您正在使用哪个编译器,但如果它是MS Visual C ++,请尝试将以下内容放在#ifdef中以验证SOMEMACRO确实 已定义。

#ifdef SOMEMACRO

#pragma message("SOMEMACRO is defined")

    case 4:
    case 5:


#endif