2

次のイテレータ マクロが提供されます (変更できません)。

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

この背後にあるアイデアは、独自の 1 つの引数のマクロを定義し、それをイテレータに渡してv1v2v3、を展開できるようになったこと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)

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 (引数 prescan ):マクロ引数がマクロ本体に代入されます。
        何も起こりUUUません、体にはありません。
        体:FOO
      • ステージ 3 (展開):本文は再びマクロ展開され、マクロではない に
        FOO展開されます。 体:UUU
        UUU

FOO引数のプレスキャンが発生する前に、本体の内部を拡張する賢い方法は思いつきません。あなたが望むことを直接行うことは不可能だと思います。

@Hasturkunの回避策に従って、パラメーターではなくマクロを作成UUUます。

于 2013-03-14T17:37:02.073 に答える