4

ネストされたマクロが機能する場合と機能しない場合があるのはなぜですか?

ケース 1:

#define name(val) #val
#define name2(front, back) name(front ## back)
...

printf("%s\n", name2(foo, bar));   // foobar

ケース 2:

#define paste(front, back) front ## back
#define name(val) #val
#define name2(front, back) name(paste(front, back))
...


printf("%s\n", name2(foo, bar));   // paste(foo, bar)
4

1 に答える 1

4

#マクロへの引数は、またはと一緒に##マクロ本体に表示された場合 ( valinの場合と同様name) 展開されないためです。この質問に対する受け入れられた回答を参照してください。

したがって、2 番目のケースでは、中間ステップを追加して、引数が確実に展開されるようにする必要があります。例:

#define paste(front, back) front ## back
#define name(val) #val
#define expand(val) name(val)  // expand val before stringifying it
#define name2(front, back) expand(paste(front, back))
于 2013-03-17T08:07:32.830 に答える