你可以用 C 中的宏来做这样的事情吗?
#define SUPERMACRO(X,Y) #define X Y
then
SUPERMACRO(A,B) expands to #define A B
我有一种感觉,因为预处理器只进行一次传递。
仅官方gcc。请不要使用第三方工具。
答案 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
然后,您可以使用编辑器宏扩展功能并粘贴丢失的#。
甚至更好:使用不同的,更强大的字符串处理语言作为预处理器。