【问题标题】:preprocessor directives inside define? [duplicate]定义内的预处理器指令? [复制]
【发布时间】:2011-05-27 05:10:07
【问题描述】:

可能重复:
C preprocessor: using #if inside #define?

在 define 的 rhs 中有什么技巧吗?问题是,预处理器将所有 rhs 折叠成一条长线。但也许有什么诀窍?

我想要的 rhs 示例是

#define MY_CHECK \
  #ifndef MY_DEF  \
  # error MY_DEF not defined  \
  #endif

?
目的很简单:使用 1 行快捷方式而不是多行检查序列。

【问题讨论】:

    标签: c-preprocessor


    【解决方案1】:

    正如其他人所指出的,预处理器宏不能扩展为任何其他预处理器指令;如果他们这样做,您通常会在输入中遇到关于杂散“#”字符的奇怪错误。然而,有时你可以做一些事情来得到你想要的。如果您想要一个扩展为类似以下内容的宏:

    #ifdef SOMETHING
    ...some code...
    #endif
    

    如果一些代码不包含任何预处理指令,你可以定义一个IFDEF宏:

    #ifdef SOMETHING
    #define IFDEF_SOMETHING(X) X
    #else
    #define IFDEF_SOMETHING(X)
    #endif
    

    然后在您的其他宏中使用IFDEF_SOMETHING(...some code...)

    如果您有一堆预处理器需要重复多次,您可以将其粘贴在自己的文件中,然后在需要的每个位置使用#include "stuff"

    【讨论】:

    • ...一些代码最好不要有逗号。
    • @John:是的,尽管使用 C99 你可以使用.../__VA_ARGS__ 来避免这个问题
    • 将预处理器指令序列放在单独的 .h 文件中并包含它是个好主意。
    【解决方案2】:

    它不起作用(第 6.10.3.4/3 节:“生成的完全用宏替换的预处理标记序列即使类似于一个……也不会作为预处理指令处理”)。

    如果你真的想要做这样的事情,你可以在编译之前通过 m4 之类的东西运行你的源代码——但我通常不建议这样做。

    【讨论】:

      【解决方案3】:

      假设有一个像GNU C Preprocessor 这样的预处理器,那么没有。 The manual says:

      编译器不会重新标记预处理器的输出。每个预处理标记成为一个编译器标记。

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多