名前空間
変種
操作

プリプロセッサ

From cppreference.com
< cpp
 
 
C++言語
全般
プリプロセッサ
コメント
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

プリプロセッサは、コンパイルが行われる前の翻訳フェーズ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ドキュメント - プリプロセッサ
English 日本語 中文(简体) 中文(繁體)