2011-05-27 57 views
7

可能重复:
C preprocessor: using #if inside #define?预处理指令内定义?

有什么窍门有内部定义的RHS预处理指令?问题是,预处理器将所有rhs折成一行。但也许有一个窍门?什么我会在RHS想

例子是

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


目的是急促:具有1行的快捷方式,而不是检查的多序列。

回答

9

正如其他人指出,预处理宏不能扩展到任何其他预处理指令;如果他们这样做的话,你通常会在输入中出现奇怪的'#'字符错误。但是,有时候你可以做些事情来获得你想要的东西。如果您希望扩展到像宏:

#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"

+0

... _some code_最好不要有任何逗号无论是。 – 2011-05-27 07:04:30

+0

@约翰:是的,虽然与C99可以用'...'/'__VA_ARGS__'以避免在不同的.h文件中预处理指令的这个问题 – 2011-05-27 16:32:57

+0

投入顺序和包括它是不错的主意。 – Andrei 2011-05-27 16:47:09

2

假设一个预处理器,如GNU C Preprocessor,则没有。 The manual says

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

4

它不起作用(§6.10.3.4/ 3:“产生的完全宏替换预处理令牌序列不作为预处理指令处理,即使它类似于...”)。

如果你真的想要做这样的事情,你可以通过编译之前类似M4运行源 - 但我一般会建议反对。