Namespaces
Variants

Preprocessor

From cppreference.net
C++ language
General topics
Preprocessor
Comments
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

プリプロセッサは 翻訳フェーズ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 プリプロセッサ