PGotMoL annex さんの記事から

void _debug_printf(const char *);
#define _num_to_str(num) #num
#define num_to_str(num) _num_to_str(num)
#define debug_printf(msg) \
_debug_printf(msg " at " __FUNC__ ":" num_to_str(__LINE__))

のように、ダミーのマクロを通せばよい。

なぜこうなるのか、プリプロセッサの動作は想像するしかないが、文字列化の識別子の優先度は高いようだ。



とあるけど、gccのプリプロセッサのinfoにズバリ書いてあるで~

Macro Pitfalls: (マクロの落とし穴)
 Separate Expansion of Macro Arguments: の項

事前走査は、引数が文字列化されたり連結されたりする場合には行われない。すなわち、

#define str(s) #s
#define foo 4
str (foo)

は "foo" に展開される。再び、事前走査による意味のある影響は防がれる。

(中略)


もう一つ、事前走査が役に立つ場合がある。事前走査で引数を展開してからそれ文字列化することが、二段階のマクロを使うことで、可能になる。上に出てきた例に新しいマクロ xstr を追加しよう。

#define xstr(s) str(s)
#define str(s) #s
#define foo 4
xstr (foo)




ま、これを読んだところ、プリプロセッサマジックという印象はぬぐえんのじゃがのー




アフリカの民族衣装
理解できない呪術的! ランキング!