名称下面迭代器宏给我(不能改变)捕获使用C宏
#define ITERATE(MACRO) \
MACRO(v1) \
MACRO(v2) \
MACRO(v3) \
MACRO(v4)
这背后的想法是,我现在可以定义自己的一个参数的宏,并将其传递到迭代器扩大为v1
,v2
,v3
,v4
。例如:
#define MYSTUFF(X) doSth(X);
ITERATE(MYSTUFF)
将扩大到
doSth(v1); doSth(v2); doSth(v3); doSth(v4);
我现在的问题是,我想这想传递一个额外的参数为MYSTUFF
超出一个提供的另一个宏内调用ITERATE
ITERATE
。
为了实现这个目标,我希望我可以用下面的结构捕捉额外的参数名称:
#define PARTIAL(T) FULL(UUU,T)
#define FULL(U,V) doSth(U,V)
#define START(UUU) ITERATE(PARTIAL)
START(bla)
我希望,当ITERATE(PARTIAL)
被扩展为:
FULL(UUU,v1) FULL(UUU,v2) FULL(UUU,v3) FULL(UUU,v4)
我居然还会捕获START
的参数UUU
,它将被替换为bla
。不幸的是,情况并非如此(至少在gcc中)。
- 你知道这样的名称捕获是否可以实现不同吗?
- 或者您可能有不同的想法如何解决将额外参数传入
MACRO
的问题? - 我可能会被允许更改
ITERATOR
定义本身,但前提是它不破坏任何现有代码已经使用它。
如果您不允许更改宏,您是否至少允许用非宏代码替换它? – stefan 2013-03-14 16:43:03
当然,我可以简单*不*使用'ITERATE',或者自己创建一个可以接受更多参数的函数 - 如果这是您要求的。但我宁愿避免这种情况。 – CygnusX1 2013-03-14 16:48:24
我建议彻底摆脱宏的使用,而不是写另一个 – stefan 2013-03-14 16:50:55