我正在尝试将两个参数宏转换为四个参数宏。从
LIST
的定义,我无法改变,我想打电话给ALL
,
提供两个额外的参数。
#define LIST(x) \
x(p1, p2) \
x(p3, p4) \
x(...
#define ALL(A, B, C, D) .../... do stuff with A, B, C and D
这是我到目前为止所尝试的内容:
#define RIGHT(C, D) C, D)
#define LEFT(A, B) (A, B, RIGHT
但是当我用gcc -E text.cpp
测试它时(LIST( ALL LEFT (q1, q2) )
)我
得到以下错误:
错误:未终止的参数列表调用宏“ALL”
仔细研究一下,这就是原因:
LIST
被替换为第一行
ALL LEFT (q1, q2)(p1, p2)
LEFT
已替换为ALL (q1, q2, RIGHT(p1, p2)
ALL
,但未找到结束
括号,有错误...... 我该怎么办?
感谢。
修改
更确切地说,使用给定的输入:
#define LIST(x) \
x("p1", "p2") \
x("p3", "p4") \
x("p5", "p6")
#define ALL(A, B, C, D) {A, B, C, D}
我想找到一种方法,结果:
{"q1", "q2", "p1", "p2"}
{"q1", "q2", "p3", "p4"}
{"q1", "q2", "p5", "p6"}
答案 0 :(得分:3)
我看到两个答案:
1)使用LIST时传递助手宏的名称:
#define to_all(c, d) ALL("q1", "q2", c, d)
LIST(to_all)
2)让LIST扩展为辅助宏,预期在使用时存在(这是一个名为x-macros的变体)。但是,这需要您重新定义列表:
// Somewhere "central"
#define LIST() \
LIST_HELPER("p1", "p2") \
LIST_HELPER("p3", "p4") \
LIST_HELPER("p5", "p6")
#define ALL(A, B, C, D) {A, B, C, D}
// When used:
#define LIST_HELPER(c, d) ALL("q1", "q2", c, d)
LIST()
#undef LIST_HELPER