C/ c++宏扩展:从两个到四个参数

C/C++ Macro expansion : from two to four parameters

本文关键字:两个 四个 参数 c++ 扩展      更新时间:2023-10-16

我正在尝试将两个参数宏转换为四个参数宏。从我不能改变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

但是当我用LIST( ALL LEFT (q1, q2) ) I测试它(gcc -E text.cpp)时得到以下错误:

错误:未终止的参数列表调用宏"ALL"

仔细看一下,原因如下:

  1. LIST被替换为第一行ALL LEFT (q1, q2)(p1, p2)
  2. LEFT替换为ALL (q1, q2, RIGHT(p1, p2)
  3. 预处理器试图扩展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"}

我看到了两个答案:

1)在使用LIST时传入helper宏的名称:

#define to_all(c, d) ALL("q1", "q2", c, d)
LIST(to_all)

2)让LIST扩展为helper宏,它在使用时应该存在(这是x-macros的一种变体)。但是,这需要您重新定义list:

// 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