忍者ブログ

どっかのゆとりのチラシの裏

plasma_effectのメモ帳的ブログのようなsomething

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

gccとVC++でプリプロセッサの挙動が違う問題

世の中にはいろいろ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

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

無題

MSVC は関数マクロの引数の展開規則に問題ありますね。
A((y))

y
になるので、関数マクロの引数を再展開(A((y))→B (y)→yの後ろ側)する場合に限って、マクロ名と左括弧の間に空白があると正しく展開されないように思えます。

カレンダー

04 2017/05 06
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

フリーエリア

最新CM

[02/12 kariya_mitsuru]
[10/14 どっかの京大生o]
[10/04 どっかのZ会生y]
[07/31 どっかのZ会生y]
[07/31 GNR]

プロフィール

HN:
plasma_effect
性別:
非公開

バーコード

ブログ内検索

最古記事

(06/08)
(06/18)
(06/21)

P R