以下迭代器宏是给我的(无法更改)
#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);
我当前的问题是,我想在另一个宏中调用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)
我实际上会捕获START
的UUU
参数,并将其替换为bla
。不幸的是,情况并非如此(至少在海湾合作委员会中)。
- 您知道这种名称捕获是否可以通过不同的方式实现吗?
- 或者也许您对如何解决向
MACRO
传递额外参数的问题有不同的想法? - 我可以被允许更改
ITERATOR
定义本身,但前提是它不会破坏任何已使用它的现有代码。
最佳答案
你不能这样做。您的 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
关于c++ - 在 C 宏中捕获名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15415166/