gcc C预处理器宏定义宏

yhived7q  于 2023-10-19  发布在  其他
关注(0)|答案(6)|浏览(143)

你能在C中用宏做类似的事情吗?

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

then

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

我有一种感觉,不是因为预处理器只做一遍。
只有官方的GCC。请不要使用第三方工具。

8wtpewkr

8wtpewkr1#

宏不能扩展为预处理指令。来自C99 6.10.3.4/3“重新扫描和进一步替换”:
得到的完全宏替换的预处理标记序列不作为预处理指令处理,即使它类似于预处理指令,

jslywgbw

jslywgbw2#

不能在其他宏中定义宏,但可以从自己的宏中调用宏,这样可以得到基本相同的结果。

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

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

e4yzc0pl

e4yzc0pl3#

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

2w2cym1i

2w2cym1i4#

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

ctrmrzij

ctrmrzij5#

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

sqxo8psd

sqxo8psd6#

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

相关问题