プリプロセッサの正確な動作に関する C++ 標準を研究しています (ある種の C++ プリプロセッサを実装する必要があります)。私が理解していることから、以下の(理解を助けるために)作成した例は有効なはずです:
#define dds(x) f(x,
#define f(a,b) a+b
dds(eoe)
su)
マクロ呼び出しのような最初の関数が(置換文字列内のコンマに注意してください) にdds(eoe)
置き換えられ、入力が再スキャンされたときと見なされることを期待しています。f(eoe,
f(eoe,su)
しかし、VC++2010 でのテストでは、これが得られました (前処理されたファイルを出力するように VC++ に指示しました)。
eoe+et_leoe+et_l
su)
これは直感に反しており、明らかに正しくありません。VC++2010 のバグですか、それとも私の C++ 標準に対する誤解ですか? 特に、私のように置換文字列の最後にカンマを入れるのは間違っていますか? C++ の標準文法についての私の理解では、preprocessing-token
そこでは any が許可されています。
編集:
GCC または他のバージョンの VC++ を持っていません。誰かがこれらのコンパイラで検証するのを手伝ってくれませんか?