Parametrized symbol concatenation
あれーー? これって OK なのか。これが使えるんなら misc の実装は 10 倍ぐらい単純かつ柔軟にできる。
#define CAT(x, y) x##y #define IFACE(arg) INTERM(CAT(arg, _), arg) -- CAT(arg, Y) #define INTERM(a, b) FIN(a, (a), b, (b)) #define FIN(a, b, c, d) a : #a | b : #b | c : #c | d : #d #define X Y IFACE(X); IFACE(__LINE__);
出力: Y_ : "Y_" | (Y_) : "(Y_)" | Y : "Y" | (Y) : "(Y)" -- YY; 8_ : "8_" | (8_) : "(8_)" | 8 : "8" | (8) : "(8)" -- 8Y;
でもおかしい。おかしい。おかしいのだ。昔 VC++ で debug 支援 macro 群を作ろうとしたときに __LINE__ が思い通りに paste してもらえなくて、出来なさにキレるまで粘った覚えがある。あるからこそ使わなかったのに。移植性が無いという事なのか?