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 してもらえなくて、出来なさにキレるまで粘った覚えがある。あるからこそ使わなかったのに。移植性が無いという事なのか?