0

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

someFunc(value)
{

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

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

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

4

9 回答 9

9

尝试以下操作:

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

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

于 2009-01-20T09:55:23.147 回答
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;
        }
    }
于 2009-01-20T09:53:28.593 回答
2

根据您的编译器,应该有一种方法可以让您阅读和检查预处理的代码。这样,您就无需从远处猜测和戳它,并且可以看到您要求编译器编译的确切代码。使用 gcc,相关选项是 -E

于 2009-01-20T09:54:53.957 回答
2

“开关”没有坏掉

或多或少地引用The Pragmatic Programmer

继续并在其他地方寻找错误。为了说服自己在 someFunc 中添加value = 4并就在那里。#define SOMEMACRO

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

于 2009-01-20T10:14:17.820 回答
1

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

于 2009-01-20T09:46:59.043 回答
0

为什么不把“return false”放在默认情况下呢?

于 2009-01-20T09:47:50.837 回答
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;
}

如果这不返回 true,那么您就有真正的问题。

于 2009-01-20T09:53:24.273 回答
0

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

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

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

于 2009-01-20T09:57:51.847 回答
0

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

#ifdef SOMEMACRO

#pragma message("SOMEMACRO is defined")

    case 4:
    case 5:


#endif
于 2009-01-20T10:00:54.587 回答