【发布时间】:2011-05-27 05:10:07
【问题描述】:
在 define 的 rhs 中有什么技巧吗?问题是,预处理器将所有 rhs 折叠成一条长线。但也许有什么诀窍?
我想要的 rhs 示例是
#define MY_CHECK \
#ifndef MY_DEF \
# error MY_DEF not defined \
#endif
?
目的很简单:使用 1 行快捷方式而不是多行检查序列。
【问题讨论】:
标签: c-preprocessor
在 define 的 rhs 中有什么技巧吗?问题是,预处理器将所有 rhs 折叠成一条长线。但也许有什么诀窍?
我想要的 rhs 示例是
#define MY_CHECK \
#ifndef MY_DEF \
# error MY_DEF not defined \
#endif
?
目的很简单:使用 1 行快捷方式而不是多行检查序列。
【问题讨论】:
标签: c-preprocessor
正如其他人所指出的,预处理器宏不能扩展为任何其他预处理器指令;如果他们这样做,您通常会在输入中遇到关于杂散“#”字符的奇怪错误。然而,有时你可以做一些事情来得到你想要的。如果您想要一个扩展为类似以下内容的宏:
#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"。
【讨论】:
.../__VA_ARGS__ 来避免这个问题
它不起作用(第 6.10.3.4/3 节:“生成的完全用宏替换的预处理标记序列即使类似于一个……也不会作为预处理指令处理”)。
如果你真的想要做这样的事情,你可以在编译之前通过 m4 之类的东西运行你的源代码——但我通常不建议这样做。
【讨论】:
假设有一个像GNU C Preprocessor 这样的预处理器,那么没有。 The manual says:
编译器不会重新标记预处理器的输出。每个预处理标记成为一个编译器标记。
【讨论】: