2012-11-14 8 views
5

私はこのコードはCとC++の両方に有効であることを知っている:マクロCでの再定義とC++

#define FOO 0 
#define FOO 0 

ISO/IEC 14882:2011

16.3マクロ置換[cpp.replace ]

2現在、オブジェクトのようなマクロとして定義されている識別子は、 秒であれば、別の#define前処理ディレクティブによって再定義された である可能性がありますond定義はオブジェクトのようなマクロ定義であり、2つの置換リストは同じです。それ以外の場合、プログラムは不正です。 同様に、ファンクションのようなマクロとして現在定義されている識別子は、 という別の#defineプリプロセッサディレクティブによって再定義されてもよく、第2の定義は、ファンクションのようなマクロ定義であり、パラメータの数字と綴りが同じで、置換リスト は同一であり、そうでない場合、プログラムは不正である。

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

#define FOO 0 
#define FOO FOO 

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

+0

これは私にとっては悪いアプローチのようです。将来の開発者が混乱やエラーを引き起こす可能性があります。 –

+1

@Jonathan Wood私はこれを実際のコードで使用したくない、ちょうど面白い瞬間 – FrozenHeart

答えて

6

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


あるいは、少なくともプリプロセッサは、それが実際にどのように異なることを起こる特定の方法を働いていた場合、結果がどうなりますか。

+1

言い換えれば、スペースを除いて、右側はトークンの同じシーケンスでなければならない。 –