【问题标题】:What can('t) I do with #if?#if 我可以(不能)做什么?
【发布时间】:2012-01-04 20:55:48
【问题描述】:

我在 config.h 中定义了一堆预处理器配置选项。我是这样使用它们的:

#if CONFIG_OPTION1
    /* do some stuff */
#endif

config.h 包含它们的定义:

#define CONFIG_OPTION1 _DEBUG
#define CONFIG_OPTION2 _DEBUG || (NDEBUG && _WIN64)
...

以上行不通。我想根据配置(调试、发布等)和/或其他定义打开和关闭这些配置选项。如果我这样做,它也不起作用:

#define CONFIG_OPTION1 defined(_DEBUG) || defined(NDEBUG)

即使条件看起来应该满足,我也永远不会进入#if CONFIG_OPTION1。当我写#if defined(_DEBUG) 时,它工作正常,但#if 使用宏作为条件失败。我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    好吧,正如您已经注意到的那样,您不能那样做。改为这样做:

    #if _DEBUG || (NDEBUG && _WIN64)
    #   define CONFIG_OPTION2 1
    #endif
    

    【讨论】:

    • +1。根据gcc.gnu.org/onlinedocs/cpp/Defined.html,“如果defined 运算符作为宏扩展的结果出现,则C 标准表示行为未定义。”
    • @Dave:你不必,不。未定义的宏名称会自动解释为零。
    • @ruakh:依赖未定义的宏为零是一种非常糟糕的做法。最好将宏显式定义为 0 和 1,并将编译器配置为在使用未定义的预处理器符号时发出错误,这样您会发现基本错误,如拼写错误,以及使用符号而不包含正确的头文件等。
    • @Lindydancer:很有趣。你说的有道理,但是我上面链接的 GNU C Preprocessor 文档实际上提出了完全相反的建议,例如由于这个属性,#if defined BUFSIZE && BUFSIZE >= 1024 可以“简化”为#if BUFSIZE >= 1024
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多