15

プリプロセッサの正確な動作に関する 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++ を持っていません。誰かがこれらのコンパイラで検証するのを手伝ってくれませんか?

4

3 に答える 3

1

さて、私が見る問題は、プリプロセッサが次のことを行うことです

ddx(x) は f(x,

ただし、 f(x, は f(a,b) として定義されていても) 同様に定義されているため、 f(x, は x+ ガベージに展開されます。

したがって、ddx(x) は最終的に x + ガベージに変換されます (f(smthing, を定義したため)。

あなたの dds(eoe) は実際には a+b に展開されます。ここで、a は eoe で、b は et_l です。そして、何らかの理由でそれを2回行います:)。

あなたが作成したこのシナリオはコンパイラ固有のものであり、プリプロセッサが定義展開の処理をどのように選択するかによって異なります。

于 2014-03-23T11:44:06.610 に答える