Namespaces
Variants

Preprocessor

From cppreference.net
< c

プリプロセッサは 翻訳フェーズ4 で実行され、コンパイルの前に処理されます。プリプロセッシングの結果は単一ファイルとなり、実際のコンパイラに渡されます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Directives、Capabilities、Example、References、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 番号部分(tocnumber)もそのまま保持しました - フォーマットと構造は完全に維持されています

ディレクティブ

プリプロセッサディレクティブはプリプロセッサの動作を制御します。各ディレクティブは1行を占め、以下の形式を持ちます:

  • # 文字
  • プリプロセス指令( define undef include if ifdef ifndef else elif elifdef elifndef (C23以降) endif line embed (C23以降) error warning (C23以降) pragma のいずれか) [1]
  • 引数(指令による)
  • 改行

ヌルディレクティブ ( # の後に改行) は許可されており、効果はありません。

機能

プリプロセッサは以下のソースファイル変換機能を備えています:

  • 条件付き ソースファイルの一部のコンパイル(ディレクティブ #if , #ifdef , #ifndef , #else , #elif , #elifdef , #elifndef (C23以降) および #endif により制御)
  • 置換 テキストマクロの置換と識別子の連結・引用(ディレクティブ #define および #undef 、演算子 # および ## により制御)
  • インクルード 他のファイルのインクルード(ディレクティブ #include および __has_include によるチェック (C23以降)
  • エラー の発生 または 警告 (C23以降) (ディレクティブ #error または #warning によりそれぞれ制御 (C23以降)

プリプロセッサの以下の側面を制御できます:

  • 実装定義 動作 (ディレクティブ #pragma および演算子 _Pragma (C99以降) により制御)
  • ファイル名と行情報 プリプロセッサで利用可能 (ディレクティブ #line により制御)

脚注

  1. これらは標準で定義されているディレクティブです。標準では他のディレクティブに対する動作を定義していません:それらは無視されるか、何らかの有用な意味を持つか、プログラムを不適格にする可能性があります。たとえ無視される場合でも、プリプロセッサの処理が完了するとソースコードから削除されます。 一般的な非標準拡張として #warning ディレクティブがあり、これはコンパイル時にユーザー定義のメッセージを出力します。 (C23まで)

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.10 プリプロセッサ指令 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 6.10 プリプロセス指令 (p: 117-129)
  • C11規格 (ISO/IEC 9899:2011):
  • 6.10 プリプロセス指令 (p: 160-178)
  • C99規格 (ISO/IEC 9899:1999):
  • 6.10 プリプロセッサ指令 (p: 145-162)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 3.8 プリプロセッサ指令

関連項目

C documentation Predefined Macro Symbols
C documentation Macro Symbol Index
C++ documentation Preprocessor