【问题标题】:Understanding preprocessor directives了解预处理器指令
【发布时间】:2013-08-14 18:41:47
【问题描述】:

为什么这段代码没有编译?如果我理解正确,这应该编译。我哪里错了?

#define THREADMODEL ASC 

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

int main() {
}

【问题讨论】:

    标签: c++ c-preprocessor preprocessor-directive


    【解决方案1】:

    当预处理器解释时

    #if THREADMODEL==NOASC
    

    它将用ASC替换THREADMODEL

    #if ASC==NOASC
    

    除非你有 #defined ASCNOASC 有数值,否则预处理器会将它们替换为 0 值(它接受任何未定义的符号并将它们替换为 0):

    #if 0==0
    

    然后计算结果为1,因此预处理器将计算该块。

    要解决此问题,请尝试为 ASCNOASC 提供不同的数值,如下所示:

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

    希望这会有所帮助!

    【讨论】:

    • 非常感谢!很好的答案!
    • 最好将扩展为表达式的宏定义完全括起来:#define NOASC (1 + ASC)
    • @KeithThompson 很好——我记得给ASC加上括号,但不是结果表达式。
    • 事实上,您不需要将ASC 括起来(假设它本身已正确定义)。您确实需要将宏参数括起来,但 ASC 是另一个宏,而不是 NOASC 的参数。
    • @KeithThompson 虽然你说得对,没有必要,但我已经被编写错误定义常量的人烧了几次,并认为额外的括号不会造成伤害,但实际上可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多