预处理器宏定义宏

55

你能在C语言中使用宏定义实现类似以下功能吗?

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

then

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

我有这样的感觉,不是因为预处理器只进行一次扫描。

只能使用官方的 GCC,不要使用第三方工具。

6个回答

39

宏不能扩展为预处理指令。从C99 6.10.3.4/3“重新扫描和进一步替换”中:

即使宏替换后的预处理标记序列类似于预处理指令,也不会将其作为预处理指令处理。


20

您不能在其他宏中定义宏,但是您可以从您的宏中调用另一个宏,这将使您基本上获得相同的结果。

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

所以,A(y)会扩展为do {printf("%d", (y)) }while(0)


4

不会。操作顺序是,所有预处理器指令在进行任何宏扩展之前都会被识别; 因此,如果一个宏展开成类似预处理器指令的东西,它不会被识别为这样,而是会被解释为(错误的)C源代码。


3

抱歉,您不能这样做。您可以在宏中调用其他宏,但不能定义新的宏。


如果您对预处理器进行了两次处理,会怎样呢? - pm100
1
语法无效。#在宏中是一种保留字符。#必须后跟宏参数才能有效。这将“字符串化”参数。 - Tuomas Pelkonen

1

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


-1
你可以这样做: #define SUPERMACRO(X,Y) define X Y
然后,您可以使用编辑器的宏扩展功能并粘贴缺少的#。
或者更好的方法是:使用不同的、更强大的字符串处理语言作为预处理器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接