プリプロセッサ
From cppreference.com
< cpp
プリプロセッサは、コンパイルが行われる前の翻訳フェーズ4で実行されます。プリプロセス処理の結果は単一のファイルとなり、それが実際のコンパイラに渡されます。
目次 |
[編集] ディレクティブ (Directives)
プリプロセスディレクティブは、プリプロセッサの動作を制御します。各ディレクティブは1行を占め、以下の形式を持ちます。
- # 文字。
- 以下が続くシーケンス。
- 標準で定義されたディレクティブ名(下記にリストアップ)と、それに対応する引数、または
- 1つ以上のプリプロセッシングトークン。ただし、開始トークンが標準で定義されたディレクティブ名でない場合、そのディレクティブは条件付きでサポートされ、処理系定義のセマンティクスを持ちます(例:一般的な非標準拡張として、コンパイル中にユーザー定義のメッセージを出力する #warning ディレクティブがあります)(C++23まで)、または
- 何もない場合。この場合、ディレクティブは効果を持ちません。
- 改行。
|
モジュールおよびインポートディレクティブもプリプロセスディレクティブです。 |
(C++20以降) |
プリプロセスディレクティブはマクロ展開から生成されてはなりません。
#define EMPTY EMPTY # include <file.h> // not a preprocessing directive
[編集] 機能 (Capabilities)
プリプロセッサはソースファイルの翻訳に関して以下の機能を持ちます。
- ソースファイルの一部を条件付きでコンパイルする(ディレクティブ #if, #ifdef, #ifndef, #else, #elif, #elifdef, #elifndef(C++23から), および #endif で制御)。
- テキストマクロを置換し、その際に識別子を連結またはクォートする(ディレクティブ #define および #undef、演算子 # および ## で制御)。
- 他のファイルをインクルードする(ディレクティブ #include で制御し、__has_include でチェック(C++17から))。
- エラーまたは警告(C++23から)を発生させる(ディレクティブ #errorまたは #warning でそれぞれ制御(C++23から))。
プリプロセッサの以下の側面を制御できます。
- 処理系定義の動作(ディレクティブ #pragma および演算子 _Pragma(C++11から) で制御)。加えて、一部のコンパイラは非標準拡張として __pragma 演算子を(様々な度合いで)サポートしています。
- プリプロセッサで利用可能なファイル名と行情報(ディレクティブ #line で制御)。
[編集] 欠陥報告 (Defect reports)
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 2001 | C++98 | 標準で定義されていないディレクティブを使用した際の動作が不明確であった | 条件付きサポートとされた |
[編集] 関連項目 (See also)
| C++ドキュメント - 定義済みマクロシンボル
| |
| C++ドキュメントのマクロシンボルインデックス
| |
| Cドキュメント - プリプロセッサ
|