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

时间:2011-10-13 13:16:07

标签: c++ macros

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

仔细研究一下,这就是原因:

  1. LIST被替换为第一行 ALL LEFT (q1, q2)(p1, p2)
  2. LEFT已替换为ALL (q1, q2, RIGHT(p1, p2)
  3. 预处理器尝试展开ALL,但未找到结束 括号,有错误......
  4. 我该怎么办?

    感谢。

    修改

    更确切地说,使用给定的输入:

    #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 个答案:

答案 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