鍋あり谷あり

テーマを決めずに適当に書いています。

私の知らないC言語

先日、プリプロセッサの動作を誤解していたことに気がついた。
#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 と書けば回避できるというのが実用的には重要だと思う。