理解预处理指令

6

为什么这段代码无法编译?如果我理解正确的话,它应该能够编译。我错在哪里了?

#define THREADMODEL ASC 

#if THREADMODEL==NOASC
THIS BLOCK SHOULDN'T BE COMPILED
#endif

int main() {
}

1
替代方案:#define THREADMODEL_ASC #ifdef THREADMODEL_ASC 第二种替代方案:#define THREADMODEL_ASC 1 #if THREADMODEL_ASC - undefined
1个回答

13

当预处理器解释代码时

#if THREADMODEL==NOASC

它将用ASC替换THREADMODEL

#if ASC==NOASC

除非您将#define ASCNOASC定义为数字值,否则预处理器将使用0值替换它们(它会将任何未定义的符号替换为0):

#if 0==0

这会评估为1,因此预处理器将评估该块。

要解决此问题,请尝试为ASCNOASC赋予不同的数字值,像这样:

#define ASC    0
#define NOASC  (1 + (ASC))

希望这能帮到你!


最好完全使用括号将宏定义展开为表达式:#define NOASC (1 + ASC) - Keith Thompson
@KeithThompson 很好的发现 - 我记得给 ASC 加上了括号,但忘记给结果表达式加上了。 - templatetypedef
实际上,您不需要在 ASC 上加括号(假设它本身已经正确定义)。但是您需要在宏参数上加括号,但是 ASC 是另一个宏,而不是 NOASC 的参数。 - Keith Thompson
@KeithThompson 虽然您是正确的,它并非必需品,但我曾经因为别人编写了错误的预定义常量而受到过损失,所以我认为多加一对括号虽然可能不会帮到忙,但也不会有害。 - templatetypedef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接