1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5.
6. FOO
プリプロセッサのみを実行すると、出力ファイルには20が含まれます。
ただし、私が理解していることから、プリプロセッサは単にテキストの置換を行います。だからこれは私が起こっていると私が思うことです(これは明らかに間違っていますがばかげています):
だから私は出力が20ではなく10であるべきだと思います。それがどこでうまくいかなかったのか何か説明できますか?
標準から関連するすべての仕様を収集するために、コメントスレッドからこの情報を抽出し、ドラフトN4527に基づいてC ++セクション番号を追加しました(2つの標準で規範的なテキストは同じです)。基準は、主題に関して完全に明確です。
#define
プリプロセッサディレクティブはマクロの置換を受けません。
(C11§6.10¶7; C ++§16[cpp]¶6):前処理ディレクティブ内の前処理トークンは、特に明記されていない限り、マクロ展開の対象にはなりません。
マクロが置換テキストで置き換えられた後、新しいテキストが再スキャンされます。プログラムのその時点でトークンのアクティブなマクロ定義がある場合、置換内のプリプロセッサトークンはマクロとして展開されます。
(C11§6.10.3¶9; C ++§16.3[cpp.replace]¶9)次の形式の前処理ディレクティブ
# define identifier replacement-list new-line
マクロ名の後続の各インスタンスを、ディレクティブの残りの部分を構成する前処理トークンの置換リストで置き換えるオブジェクトのようなマクロを定義します。次に、以下に指定されているように、置換リストを再スキャンして、より多くのマクロ名を探します。
マクロ定義は、マクロ名のforの後の行から、またはファイルの終わり#define
までアクティブ#undef
です。
(C11§6.10.3.5¶1; C ++§16.3.5[cpp.scope]¶1)マクロ定義は、対応する
#undef
ディレクティブが検出されるまで、または(検出されない場合は)、前処理翻訳単位。マクロ定義は、翻訳フェーズ4以降は意味がありません。
プログラムを見ると:
#define NUM 10
#define FOO NUM
#undef NUM
#define NUM 20
FOO
NUM
1行目のマクロ定義は3行目まで続くことがわかります。これらの行には置換可能なテキストがないため、定義は使用されません。したがって、プログラムは事実上次のものと同じです。
#define FOO NUM
#define NUM 20
FOO
このプログラムでは、第三のラインで、存在のためにアクティブな定義でFOO
置換リストと、NUM
、およびのためのNUM
置換リストと、20
。FOO
それを作る、その置換リストに置き換えられNUM
、次いでそれは再び、その結果、マクロスキャンされNUM
、最終結果は、ということであるので、交換が再び再スキャンされることをその置換リスト20で置換され、ない定義されたマクロがありますトークン20
は変換フェーズ5での処理に残されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加