有什么窍门有内部定义的RHS预处理指令?问题是,预处理器将所有rhs折成一行。但也许有一个窍门?什么我会在RHS想
例子是
#define MY_CHECK \
#ifndef MY_DEF \
# error MY_DEF not defined \
#endif
?
目的是急促:具有1行的快捷方式,而不是检查的多序列。
有什么窍门有内部定义的RHS预处理指令?问题是,预处理器将所有rhs折成一行。但也许有一个窍门?什么我会在RHS想
例子是
#define MY_CHECK \
#ifndef MY_DEF \
# error MY_DEF not defined \
#endif
?
目的是急促:具有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"
。
假设一个预处理器,如GNU C Preprocessor,则没有。 The manual says:
编译器不重新标记预处理器的输出。每个预处理令牌都将成为一个编译器令牌。
它不起作用(§6.10.3.4/ 3:“产生的完全宏替换预处理令牌序列不作为预处理指令处理,即使它类似于...”)。
如果你真的想要做这样的事情,你可以通过编译之前类似M4运行源 - 但我一般会建议反对。
... _some code_最好不要有任何逗号无论是。 – 2011-05-27 07:04:30
@约翰:是的,虽然与C99可以用'...'/'__VA_ARGS__'以避免在不同的.h文件中预处理指令的这个问题 – 2011-05-27 16:32:57
投入顺序和包括它是不错的主意。 – Andrei 2011-05-27 16:47:09