先日、プリプロセッサの動作を誤解していたことに気がついた。
#define foo bar
は、foo を bar にし、 foo(x) も同じように bar(x) にするが、
#define baz(x) hoge
は、baz(0) を hoge にするものの、baz は baz のままにする。
という仕様を理解していなかった。引数が足りなくてエラー、という動作だと思いこんでいた。
で。
であるならば。
こんな事が書ける:
struct foo{ foo( int ){} }; #define foo( a ) (0) foo foo = foo( foo );
foo foo = foo( foo ); の、最初の foo は、構造体。二つめの foo は、変数名。三つ目の foo はマクロ名。四つ目の foo は、二つめの foo で導入された変数名。
それはともかく。
悪名高き max, min マクロは、(max) とか max