web-dev-qa-db-ja.com

マクロを定義するCプリプロセッサマクロ

[〜#〜] c [〜#〜]のマクロを使用して、このようなことを実行できますか?

#define SUPERMACRO(X,Y) #define X Y

then

SUPERMACRO(A,B) expands to #define A B

プリプロセッサは1つのパスしか実行しないので、私はそうは思わない。

公式gccのみ。サードパーティのツールは使用しないでください。

41
Mike

マクロを前処理ディレクティブに展開することはできません。 C99 6.10.3.4/3から「再スキャンとさらなる交換」:

結果として完全にマクロで置き換えられた前処理トークンシーケンスは、たとえ類似していても、前処理ディレクティブとして処理されません。

33
Michael Burr

マクロを他のマクロで定義することはできませんが、マクロからマクロを呼び出すことができます。これにより、基本的に同じ結果が得られます。

_#define B(x) do {printf("%d", (x)) }while(0)
#define A(x) B(x)
_

したがって、A(y)do {printf("%d", (y)) }while(0)に展開されます

15
WhirlWind

いいえ。操作の順序は、マクロの展開が行われる前にすべてのプリプロセッサディレクティブが認識されるようなものです。したがって、マクロがプリプロセッサディレクティブのように展開された場合、マクロはそのように認識されず、(誤った)Cソーステキストとして解釈されます。

3
John Bode

すみません、できません。マクロで他のマクロを呼び出すことはできますが、新しいマクロを定義することはできません。

2
Tuomas Pelkonen

前処理オプションのみで実行してから、前処理済みファイルでコンパイルすることもできます。

1
user922475

あなたはこれを行うかもしれません:#define SUPERMACRO(X、Y)define X Y

次に、エディターのマクロ拡張機能を使用して、欠落している#に貼り付けます。

あるいはさらに良い:別のより強力な文字列処理言語をプリプロセッサーとして使用します。

0
user2096143