c++ - 将宏参数中的序列转换为单独的宏

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

如果定义类似于 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。

最佳答案

最简单的方法是像这样使用序列迭代(不需要 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)

关于c++ - 将宏参数中的序列转换为单独的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19680962/

相关文章:

c++ - 扩展初始化列表仅适用于

c++ - 函数参数使用 'const'

c++ - 如何在 C/C++ 中对多维数组进行排序

c++ - Qt 从资源包目录中读取文件

c++ - 如何使用 SDL2 Texture 作为更新 Canvas ?

android - qt for android 找不到我的物理设备

c++ - QSystemTrayIcon 并不总是出现

c++ - 如何定义一个宏来定义一个调用自身的函数?

比较预处理器宏是否相等

c++ - 宏中的 typedef 字符