C预处理器宏定义宏

时间:2010-03-11 22:34:49

标签: gcc c-preprocessor

你可以用 C 中的宏来做这样的事情吗?

#define SUPERMACRO(X,Y) #define X Y

then

SUPERMACRO(A,B) expands to #define A B

我有一种感觉,因为预处理器只进行一次传递。

仅官方gcc。请不要使用第三方工具。

7 个答案:

答案 0 :(得分:30)

宏无法扩展到预处理指令。从C99 6.10.3.4/3“重新扫描和进一步更换”:

  

生成的完全宏替换的预处理标记序列不会被处理为预处理指令,即使它类似于一个,

答案 1 :(得分:14)

您无法在其他宏中定义宏,但您可以从宏中调用宏,这可以获得基本相同的结果。

#define B(x) do {printf("%d", (x)) }while(0)
#define A(x) B(x)

因此,A(y)已扩展为do {printf("%d", (y)) }while(0)

答案 2 :(得分:4)

有一种技术使用#include而不是#define产生类似的结果;看到我对这个类似问题的回答:macro definition containing #include directive

答案 3 :(得分:3)

没有。操作的顺序是在完成任何宏扩展之前识别所有预处理器指令;因此,如果宏扩展为看起来像预处理器指令的东西,它将不会被识别为这样,而是被解释为(错误的)C源文本。

答案 4 :(得分:2)

对不起,你不能。您可以在宏中调用其他宏,但不能定义新宏。

答案 5 :(得分:1)

您可以尝试仅使用预处理选项运行它,然后使用预处理文件进行编译。

答案 6 :(得分:0)

你可能会这样做: #define SUPERMACRO(X,Y)定义X Y

然后,您可以使用编辑器宏扩展功能并粘贴丢失的#。

甚至更好:使用不同的,更强大的字符串处理语言作为预处理器。