预处理器指令里面定义?

时间:2011-05-27 05:10:08

标签: c-preprocessor

  

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

在rhs rhs中有预处理器指令吗?问题是,预处理器将所有rhs折叠成一条长行。但也许有一招?

我在rhs中想要的例子是

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


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

3 个答案:

答案 0 :(得分:11)

正如其他人所说,预处理器宏不能扩展到任何其他预处理器指令;如果他们这样做,你通常会在输入中得到关于迷路'#'字符的奇怪错误。但是,有时你可以做些什么来获得你想要的东西。如果您想要一个扩展为类似的宏:

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

答案 1 :(得分:5)

它不起作用(§6.10.3.4/ 3:“结果完全宏替换的预处理标记序列不会被处理为预处理指令,即使它类似于一个......”)。

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

答案 2 :(得分:4)

假设像[{3}}这样的预处理器,那么没有。 GNU C Preprocessor

  

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

相关问题