给我以下迭代器宏(无法更改)
#define ITERATE(MACRO) \
MACRO(v1) \
MACRO(v2) \
MACRO(v3) \
MACRO(v4)
这背后的想法是我现在可以定义我自己的单参数宏并将其传递给迭代器以展开v1
,v2
,v3
,{{1} }。例如:
v4
将扩展为
#define MYSTUFF(X) doSth(X);
ITERATE(MYSTUFF)
我当前的问题是,我想在另一个宏中调用doSth(v1); doSth(v2); doSth(v3); doSth(v4);
,这个宏想要将额外的参数传递给ITERATE
,而不是MYSTUFF
提供的参数。
为了达到这个目的,我希望能用以下结构捕获额外的参数名称:
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)
的{{1}}参数,它将被UUU
替换。不幸的是情况并非如此(至少在gcc中)。
START
的问题有不同的想法?bla
定义本身,但前提是它不会破坏任何已使用它的现有代码。答案 0 :(得分:2)
你不能这样做。您的START()
宏基本上只接受一个参数,然后丢弃。
您可以做的是在您需要的地方定义UUU
,例如
#define PARTIAL(T) FULL(UUU,T)
#define FULL(U,V) doSth(U,V)
#define START() ITERATE(PARTIAL)
// ...
#define UUU blah
START()
#undef UUU
答案 1 :(得分:2)
您的问题,简化,如下所示:
#define FOO UUU
#define START(UUU) FOO
START(5)
以下是发生的事情:
START
中遇到START(5)
UUU
= 5)而扩展:
5
不是一个宏
正文:FOO
UUU
不在身体内
正文:FOO
FOO
扩展为UUU
,这不是宏
正文:UUU
在参数预扫描发生之前,我无法想到在身体内扩展FOO
的任何聪明方法。我认为不可能直接做你想做的事。
使用@ Hasturkun 的解决方法,并使UUU
成为宏,而不是参数。