C++ #开关语句中的ifdef错误?

C++ #开关语句中的ifdef错误?,c++,macros,switch-statement,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; } someFunc(value) { switch(value){

我有一些代码如下所示:

someFunc(value)
{

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}
    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;
        }
    }
定义了SOMEMACRO,假设值为4。。为什么跳过案例4和5,而返回FALSE(


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

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

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

假设中的某个内容不正确,像这样更改代码,然后从那里向后操作

#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,您就遇到了真正的问题。

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

诚然,我更愿意维护看起来更像这样的代码:

someFunc(value)
{

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}
    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;
        }
    }

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

尝试以下操作:

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

编译这段代码,看看编译器会给你两个错误中的哪一个。

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

如果宏是由生成系统定义的,那么找到宏的一个好方法是:将生成输出传输到grep(或类似的文本搜索工具)以搜索宏定义(类似于:
make | grep“-DSOMEMACRO”


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

与其他假设一样,我认为您的一个假设肯定是错误的。你不说你在使用哪一个编译器,但是如果是MS VisualC++,试着在你的“yfIFDEF”中设置下面的例子来验证SoMeMac真的<强>是< /强>定义。
#ifdef SOMEMACRO

#pragma message("SOMEMACRO is defined")

    case 4:
    case 5:


#endif
“开关”没有坏

或多或少地引用

去别的地方找找错误。要说服自己在someFunc中添加
value=4
#定义SOMEMACRO


创建一个干净的构建,以确保每个依赖性都得到解决。

当预处理器没有执行我认为应该执行的操作时,我经常使用这种技术。诊断速度肯定比运行程序找出问题要快得多。这很好:)我检查了宏并定义了宏。。因此,错误可能在别处。。但是,如果我只删除IFDEF,代码就工作了……(任何想法?奇怪的是,现在代码没有问题……我甚至没有更改代码……我猜这不是宏问题。谢谢…谢谢大家,我明天早上再检查一下)BTW,我使用MS Visual C++ 6…我想这一个解决了我的问题,但我想我的问题措辞不对。。