名前空間
変種
操作

プリプロセッサ

From cppreference.com
< c

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

目次

[編集] ディレクティブ

プリプロセッサディレクティブはプリプロセッサの動作を制御します。各ディレクティブは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 ドキュメント 事前定義マクロ
C ドキュメント マクロシンボルインデックス
C++ ドキュメント プリプロセッサ
English 日本語 中文(简体) 中文(繁體)