【问题标题】:Translate sequence in macro parameters to separate macros将宏参数中的序列转换为单独的宏
【发布时间】:2013-10-30 11:28:25
【问题描述】:

如果定义类似于 MACRO(name, seq) 并且代码如下,如何访问宏中的每个元素:

MACRO("TheName",
   (Elem1)
   (Elem2)
   (Elem3)
)

我要生成下一个代码:

MACRO("TheName",
   ELEMMACRO(Elem1)
   ELEMMACRO(Elem2)
   ELEMMACRO(Elem3)
)

或者类似的东西。换句话说,我想分别处理每个参数(我不在乎定义,即使它会像

MACRO("TheName",
   Elem1,
   Elem2,
   Elem3
)

元素可能更多,也可能更少。我试过__V_ARGS__(我只需要gcc),但我只能复制所有元素,不能单独处理。

我能做什么?

附:由于某些原因,我无法使用 Boost。

【问题讨论】:

  • 可以使用c++11的特性吗?如果是这样,您也许可以在使用新的可变参数模板功能后实现您的目标
  • @benjymous,实际上,不,因为 GCC 对 C++11 的支持仍处于试验阶段。

标签: c++ qt macros c-preprocessor variadic-macros


【解决方案1】:

最简单的方法是像这样使用序列迭代(不需要boost):

#define PRIMITIVE_SEQ_ITERATE(...) __VA_ARGS__ ## _END
#define SEQ_ITERATE(...) PRIMITIVE_SEQ_ITERATE(__VA_ARGS__)

#define MACRO_EACH(seq) SEQ_ITERATE(MACRO_EACH_1 seq) 
#define MACRO_EACH_1(...) ELEMMACRO(__VA_ARGS__) MACRO_EACH_2
#define MACRO_EACH_2(...) ELEMMACRO(__VA_ARGS__) MACRO_EACH_1
#define MACRO_EACH_1_END
#define MACRO_EACH_2_END

将为序列中的每个元素调用您的ELEMMACRO

MACRO_EACH
(
    (Elem1)
    (Elem2)
    (Elem3)
)

并将扩展至此:

ELEMMACRO(Elem1)
ELEMMACRO(Elem2)
ELEMMACRO(Elem3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多