2

下面的迭代器宏给了我(不能改变)

#define ITERATE(MACRO) \
    MACRO(v1) \
    MACRO(v2) \
    MACRO(v3) \
    MACRO(v4)

这背后的想法是我现在可以定义自己的单参数宏并将其传递给迭代器以扩展 for v1, v2, v3, v4。例如:

#define MYSTUFF(X) doSth(X);
ITERATE(MYSTUFF)

将扩大到

doSth(v1); doSth(v2); doSth(v3); doSth(v4);

我当前的问题是我想ITERATE在另一个宏中调用,该宏想将一个额外的参数传递MYSTUFFITERATE.

为了实现这一点,我希望我可以使用以下构造捕获额外的参数名称:

#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)

我实际上将捕获 的UUU参数,START并将其替换为bla. 不幸的是,情况并非如此(至少在 gcc 中)。

  • 你知道这样的名字捕获是否可以不同的方式实现?
  • 或者您可能有不同的想法如何解决将额外参数传递到的问题MACRO
  • 我可能被允许更改ITERATOR定义本身,但前提是它不会破坏任何已经使用它的现有代码。
4

2 回答 2

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
于 2013-03-14T16:57:06.517 回答
2

您的问题简化后如下所示:

#define FOO UUU
#define START(UUU) FOO
START(5)

这是发生的事情:

  • START在行中遇到START(5)
    • START 是一个类似函数的宏,因此使用参数UUU=5) 进行扩展:
      • 第 1 阶段(参数扩展):宏参数被宏扩展
        什么都没有发生,5不是宏。
        身体:FOO
      • 第 2 阶段(参数预扫描):宏参数被替换到宏体中。
        什么都没有发生,UUU不在体内。
        身体:FOO
      • 第 3 阶段(扩展):主体被宏扩展,再次
        FOO扩展为UUU,这不是宏。
        身体:UUU

在参数预扫描发生之前,我想不出任何巧妙的方法来FOO在体内扩展。我认为不可能直接做你想做的事。

使用@ Hasturkun的解决方法并制作UUU一个宏,而不是一个参数。

于 2013-03-14T17:37:02.073 回答