在C宏中捕获名称

时间:2013-03-14 16:41:21

标签: c++ c macros

给我以下迭代器宏(无法更改)

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

这背后的想法是我现在可以定义我自己的单参数宏并将其传递给迭代器以展开v1v2v3,{{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定义本身,但前提是它不会破坏任何已使用它的现有代码。

2 个答案:

答案 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)
    • START是一个类似函数的宏,所以它随着参数UUU = 5)而扩展:
      • 第1阶段(参数扩展):宏参数是宏扩展的 没有任何事情发生,5不是一个宏 正文:FOO
      • 第2阶段(argument prescan):宏参数被替换为宏体。
        没有任何事情发生,UUU不在身体内 正文:FOO
      • 阶段3(扩展):身体再次进行宏观扩展 FOO扩展为UUU,这不是宏 正文:UUU

在参数预扫描发生之前,我无法想到在身体内扩展FOO的任何聪明方法。我认为不可能直接做你想做的事。

使用@ Hasturkun 的解决方法,并使UUU成为宏,而不是参数。