Preprocessor
From cppreference.net
<
cpp
プリプロセッサは 翻訳フェーズ4 で実行され、コンパイルの前に処理されます。プリプロセッシングの結果は単一ファイルとなり、実際のコンパイラに渡されます。
目次 |
ディレクティブ
プリプロセッサディレクティブはプリプロセッサの動作を制御します。各ディレクティブは1行を占め、以下の形式を持ちます:
- the # 文字。
- 以下の連続:
-
- 標準で定義されたディレクティブ名( 後述 の一覧)とそれに対応する引数、または
- 一つ以上の プリプロセッシングトークン で最初のトークンが標準定義ディレクティブ名ではない場合、このディレクティブは条件付きサポートとなり、実装定義のセマンティクスを持つ (例:一般的な非標準拡張として #warning ディレクティブがあり、コンパイル時にユーザー定義メッセージを出力する) (C++23まで) 、または
- 何もない場合、このディレクティブは効果を持たない。
- 改行。
|
モジュールとインポートディレクティブ もまた前処理ディレクティブです。 |
(C++20以降) |
プリプロセッシングディレクティブはマクロ展開から生成されてはなりません。
#define EMPTY EMPTY # include <file.h> // プリプロセスディレクティブではありません
機能
プリプロセッサは以下のソースファイル変換機能を有します:
- 条件付き ソースファイルの一部をコンパイル(ディレクティブ #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 によって制御)。
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 2001 | C++98 | 非標準定義ディレクティブ使用時の動作が不明確であった | 条件付きサポートとされた |
関連項目
|
C++ documentation
for
定義済みマクロシンボル
|
|
|
C++ documentation
for
マクロシンボル索引
|
|
|
C documentation
for
プリプロセッサ
|