世の中にはいろいろC++のコンパイラが存在するがとりわけgccとclangとMSVCが使われてると思う(あくまで著者の主観です、あとMSVCがC++コンパイラかどうかは議論がわかれます)。闇の言語であるC++の機能の中でも特に闇であるプリプロセッサだが、これがgccとMSVCで挙動が違う。以下のコードを見てほしい。これをgccで展開すれば
こうなる>
> xy
一方でMSVCで展開すれば以下のようになる(/P /EPオプション使用)
> cat main.i
>
>
>
>
>
> xB (y)
これはつまり展開の順番が違うということである。同一のプリプロセッサでもコンパイラによって挙動が違ってくる。これを知らずにコードを書くと死あるのみである。
ていうか普通に死にそうなのでやめてほしい。
ちなみにだがこれはAの定義をA(a) B(a)に、最後の行をCAT(x,A(y))にするとgccとMSVCで挙動が
一致する。調査の必要性を感じる。
PR