你能在C中用宏做类似的事情吗?
#define SUPERMACRO(X,Y) #define X Y then SUPERMACRO(A,B) expands to #define A B
我有一种感觉,不是因为预处理器只做一遍。只有官方的GCC。请不要使用第三方工具。
8wtpewkr1#
宏不能扩展为预处理指令。来自C99 6.10.3.4/3“重新扫描和进一步替换”:得到的完全宏替换的预处理标记序列不作为预处理指令处理,即使它类似于预处理指令,
jslywgbw2#
不能在其他宏中定义宏,但可以从自己的宏中调用宏,这样可以得到基本相同的结果。
#define B(x) do {printf("%d", (x)) }while(0) #define A(x) B(x)
因此,A(y)扩展为do {printf("%d", (y)) }while(0)
A(y)
do {printf("%d", (y)) }while(0)
e4yzc0pl3#
操作的顺序是这样的,所有的预处理器指令在任何宏扩展完成之前被识别;因此,如果一个宏扩展成看起来像预处理器指令的东西,它不会被识别,而是会被解释为(错误的)C源代码文本。
2w2cym1i4#
对不起,你不能。可以在宏中调用其他宏,但不能定义新宏。
ctrmrzij5#
您可以尝试只使用预处理选项运行它,然后使用预处理文件进行编译。
sqxo8psd6#
你可以这样做:#define SUPERMACRO(X,Y)define X Y然后,您可以使用编辑器的宏扩展功能并粘贴缺少的#。或者更好:使用不同的、更强大的字符串处理语言作为预处理器。
6条答案
按热度按时间8wtpewkr1#
宏不能扩展为预处理指令。来自C99 6.10.3.4/3“重新扫描和进一步替换”:
得到的完全宏替换的预处理标记序列不作为预处理指令处理,即使它类似于预处理指令,
jslywgbw2#
不能在其他宏中定义宏,但可以从自己的宏中调用宏,这样可以得到基本相同的结果。
因此,
A(y)
扩展为do {printf("%d", (y)) }while(0)
e4yzc0pl3#
操作的顺序是这样的,所有的预处理器指令在任何宏扩展完成之前被识别;因此,如果一个宏扩展成看起来像预处理器指令的东西,它不会被识别,而是会被解释为(错误的)C源代码文本。
2w2cym1i4#
对不起,你不能。可以在宏中调用其他宏,但不能定义新宏。
ctrmrzij5#
您可以尝试只使用预处理选项运行它,然后使用预处理文件进行编译。
sqxo8psd6#
你可以这样做:#define SUPERMACRO(X,Y)define X Y
然后,您可以使用编辑器的宏扩展功能并粘贴缺少的#。
或者更好:使用不同的、更强大的字符串处理语言作为预处理器。