プリプロセッサ
提供: cppreference.com
< cpp
プリプロセッサは、コンパイルの前、翻訳のフェーズ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
指令によって制御されます)。
プリプロセッサの以下の面は制御することができます。
- 処理系定義の動作 (
#pragma
指令および_Pragma
演算子(C++11以上)によって制御されます)。 - プリプロセッサに利用可能なファイル名および行番号情報 (
#line
指令によって制御されます)
[編集]注釈
- ↑これらは標準によって定義されている指令です。 標準はそれ以外の指令に対する動作を定義していません。 それらは無視されたり、何らかの有用な意味を持っていたり、コンパイル時エラーを発生させたりするかもしれません。 無視されるとしても、それらはプリプロセッサが終わったときには、ソースコードから削除されます。 非標準の拡張としてよくあるものは、コンパイル中にユーザ定義のメッセージを発行する指令
#warning
です。
[編集]関連項目
プリプロセッサ の C言語リファレンス |