名前空間
変種
操作

プリプロセッサ

提供: cppreference.com
< cpp
 
 
C++言語
一般的なトピック
プリプロセッサ
コメント
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定(C++20未満)
noexcept 指定子(C++11)
例外
名前空間
指定子
decltype(C++11)
auto(C++11)
alignas(C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr(C++11)
ユーザ定義(C++11)
ユーティリティ
属性(C++11)
typedef 宣言
型エイリアス宣言(C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

プリプロセッサは、コンパイルの前、翻訳のフェーズ4で実行されます。 プリプロセッサの結果は、その後実際のコンパイラに渡される、単一のファイルです。

目次

[編集]指令

プリプロセッサ指令はプリプロセッサの動作を制御します。 それぞれの指令は1行を占め、以下の書式を持ちます。

  • # 文字
  • プリプロセッサ命令 (define, undef, include, if, ifdef, ifndef, else, elif, endif, line, error, pragma のいずれか) [1]
  • 引数 (命令によります)
  • 改行

空指令 (# に改行が続いたもの) も使用することができ、何の効果も持ちません。

インポート宣言もプリプロセッサ指令です。

(C++20以上)

プリプロセッサ指令はマクロ展開から現れてはなりません。

#define EMPTY EMPTY # include <file.h> // プリプロセッサ指令ではありません。

[編集]能力

プリプロセッサはソースファイル変換の能力を持ちます。

  • ソースファイルの一部を条件コンパイルする (#if, #ifdef, #ifndef, #else, #elif, #endif 指令によって制御されます)。
  • テキストマクロを置換すると共に識別子を連結したり引用符で囲ったりする (#define, #undef 指令および #, ## 演算子によって制御されます)。
  • 他のファイルをインクルードする (#include 指令によって制御され、 __has_include によってチェック(C++17以上)されます)。
  • エラーを発生させます (#error 指令によって制御されます)。

プリプロセッサの以下の面は制御することができます。

[編集]注釈

  1. これらは標準によって定義されている指令です。 標準はそれ以外の指令に対する動作を定義していません。 それらは無視されたり、何らかの有用な意味を持っていたり、コンパイル時エラーを発生させたりするかもしれません。 無視されるとしても、それらはプリプロセッサが終わったときには、ソースコードから削除されます。 非標準の拡張としてよくあるものは、コンパイル中にユーザ定義のメッセージを発行する指令 #warning です。

[編集]関連項目

プリプロセッサC言語リファレンス
close