Microsoft Visual Studioコンパイラとgccは、次の小さなスニペットを異なる方法で前処理することを発見しました。
# define M3(x, y, z) x + y + z
# define M2(x, y) M3(x, y)
# define P(x, y) {x, y}
# define M(x, y) M2(x, P(x, y))
M(a, b)
'gcc -E'は、次のようになります。
a + {a + b}
、一方、'cl / E'は、マクロ引数の欠落に関する警告を発行し、次の出力を生成します。
a + {a, b} +
ネストされたマクロ展開からのコンマは、引数の区切り文字とは見なされないようです。残念ながら、clプリプロセッサに実装されているアルゴリズムの説明が見つからなかったため、私の提案が正しいかどうかはわかりません。clプリプロセッサがどのように機能するか、そしてそのアルゴリズムとgccのアルゴリズムの違いを知っている人はいますか?そして、観察された行動をどのように説明することができますか?