5

このコードが C と C++ の両方で有効であることはわかっています。

#define FOO 0
#define FOO 0

ISO/IEC 14882:2011

16.3 マクロ置換 [cpp.replace]

2 現在オブジェクトのようなマクロとして定義されている識別子は、2 番目の定義がオブジェクトのようなマクロ定義であり、2 つの置換リストが同一であるという条件で、別の #define 前処理ディレクティブによって再定義できます。そうでない場合、プログラムの形式が正しくありません。同様に、関数のようなマクロとして現在定義されている識別子は、別の #define 前処理ディレクティブによって再定義できます。ただし、2 番目の定義が、パラメーターの数とスペルが同じ関数のようなマクロ定義であり、2 つの置換リストが同一である場合に限ります。そうでない場合、プログラムの形式が正しくありません。

しかし、このコードはどうですか?

#define FOO 0
#define FOO FOO

置換リストは、前処理の開始時に同一ではありません (最初の置換が発生した場合のみ)。

4

1 に答える 1

6

これは、C または C++ では許可されていません。置換リストは同一でなければなりません。あなたが話していること(最初のパスの後)は、置換リスト自体ではなく、置換リスト1を処理した結果です。置換リスト自体が同一でないため、コードは許可されません。


1または、少なくとも、プリプロセッサが実際の動作とは異なる特定の方法で動作した場合の結果はどうなるでしょうか。

于 2012-11-14T17:42:22.177 に答える