Namespaces
Variants

Source file inclusion

From cppreference.net

現在のソースファイルに、ディレクティブの直後の行で別のソースファイルをインクルードします。

目次

構文

#include < h-char-sequence > new-line (1)
#include " q-char-sequence " new-line (2)
#include pp-tokens new-line (3)
__has_include ( " q-char-sequence " )
__has_include ( < h-char-sequence > )
(4) (C23以降)
__has_include ( string-literal )
__has_include ( < h-pp-tokens > )
(5) (C23以降)
1) 一意に識別されるヘッダーを h-char-sequence で検索し、そのディレクティブをヘッダーの全内容で置き換えます。
2) q-char-sequence で識別されるソースファイルを検索し、ディレクティブをそのソースファイルの内容全体で置き換えます。 (1) にフォールバックし、 q-char-sequence をヘッダ識別子として扱う場合があります。
3) もし (1) (2) のどちらにもマッチしない場合、 pp-tokens はマクロ置換を受けます。置換後のディレクティブは再度 (1) または (2) とのマッチングが試行されます。
4) ヘッダーファイルまたはソースファイルがインクルード可能かどうかをチェックします。
5) もし (4) が一致しない場合、 h-pp-tokens はマクロ置換を受けます。置換後のディレクティブは (4) との照合が再度試行されます。
new-line - 改行文字
h-char-sequence - 1つ以上の h-char のシーケンス。以下のいずれかが出現すると未定義動作を引き起こす:
  • 文字 '
  • 文字 "
  • 文字 \
  • 文字シーケンス //
  • 文字シーケンス /*
h-char - 改行と > を除く ソース文字セット の任意のメンバー
q-char-sequence - 1つ以上の q-char のシーケンス。以下のいずれかが出現すると未定義動作を引き起こす:
  • 文字 '
  • 文字 \
  • 文字シーケンス //
  • 文字シーケンス /*
q-char - 改行と " を除く ソース文字セット の任意のメンバー
pp-tokens - 1つ以上の 前処理トークン のシーケンス
string-literal - 文字列リテラル
h-pp-tokens - > を除く1つ以上の 前処理トークン のシーケンス

説明

1) h-char-sequence で識別されるファイルを実装定義の方法で検索します。この構文の意図は、実装の制御下にあるファイルを検索することです。典型的な実装では、標準インクルードディレクトリのみを検索します。標準Cライブラリはこれらの標準インクルードディレクトリに暗黙的に含まれます。標準インクルードディレクトリは通常、コンパイラオプションを通じてユーザーが制御できます。
2) 実装定義の方法で q-char-sequence によって識別されるファイルを検索します。この構文の意図は、実装によって制御されないファイルを検索することです。典型的な実装では、まず現在のファイルが存在するディレクトリを検索し、ファイルが見つからない場合のみ (1) と同様に標準インクルードディレクトリを検索します。
3) ディレクティブ内の include の後の前処理トークンは、通常のテキストと同様に処理される(すなわち、マクロ名として現在定義されている各識別子は、その置換リストの前処理トークンで置き換えられる)。すべての置換後に得られるディレクティブは、前述の2つの形式のいずれかに一致しなければならない。 < > の前処理トークンペア、または " 文字のペアの間の前処理トークン列が、単一のヘッダ名前処理トークンに結合される方法は実装定義である。
4) h-char-sequence または q-char-sequence によって識別されるヘッダまたはソースファイルは、その前処理トークンシーケンスが構文 (3) pp-tokens であるかのように検索されますが、それ以上のマクロ展開は行われません。そのようなディレクティブが #include ディレクティブの構文要件を満たさない場合、プログラムは不適格です。 __has_include 式は、ソースファイルの検索が成功した場合は 1 に評価され、検索が失敗した場合は 0 に評価されます。
5) この形式は、構文 (4) が一致しない場合にのみ考慮され、その場合、プリプロセストークンは通常のテキストと同様に処理されます。

ファイルが見つからない場合、プログラムは不適格となります。

__has_include #if および #elif の式内で展開可能です。 #ifdef #ifndef #elifdef #elifndef および defined によって定義済みマクロとして扱われますが、他の場所では使用できません。

(C23以降)

注記

典型的な実装では、構文(1)に対して標準インクルードディレクトリのみを検索します。標準Cライブラリはこれらの標準インクルードディレクトリに暗黙的に含まれています。標準インクルードディレクトリは通常、コンパイラオプションを通じてユーザーが制御できます。

構文 (2) の意図は、実装によって制御されないファイルを検索することです。典型的な実装では、まず現在のファイルが存在するディレクトリを検索し、その後 (1) にフォールバックします。

ファイルがインクルードされると、それは 翻訳フェーズ 1-4によって処理され、これには実装定義のネスト制限に達するまで、再帰的にネストされた #include ディレクティブの展開が含まれる場合があります。同じファイルの重複インクルードや、ファイルが自身を(推移的に)インクルードした場合の無限再帰を防ぐために、 ヘッダーガード が一般的に使用されます:ヘッダー全体が以下のようにラップされます

#ifndef FOO_H_INCLUDED /* ファイル名に一意にマッピングされる任意の名前 */
#define FOO_H_INCLUDED
// ファイルの内容がここに記述される
#endif

多くのコンパイラは非標準の pragma #pragma once も同様の効果を持つものとして実装しています:同じファイル(ファイルの同一性はOS固有の方法で決定される)が既にインクルードされている場合、そのファイルの処理を無効にします。

**翻訳のポイント:** - HTMLタグ、属性、 内のテキストは翻訳せず保持 - C++固有の用語(pragma, #pragma once)は翻訳せず保持 - 技術文書として正確で専門的な表現を使用 - 元のフォーマットと構造を完全に維持

__has_include の結果が 1 であることは、指定された名前のヘッダーまたはソースファイルが存在することを意味するのみです。これは、そのヘッダーまたはソースファイルがインクルードされた際にエラーが発生しないことや、有用な内容を含んでいることを保証するものではありません。

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.4.7 ヘッダー名 (p: 69)
  • 6.10.1 条件付きインクルード (p: 165-169)
  • 6.10.2 ソースファイルのインクルード (p: 169-170)
  • C17規格 (ISO/IEC 9899:2018):
  • 6.10.2 ソースファイルのインクルード (p: 119-120)
  • C11規格 (ISO/IEC 9899:2011):
  • 6.10.2 ソースファイルのインクルード (p: 164-166)
  • C99規格 (ISO/IEC 9899:1999):
  • 6.10.2 ソースファイルのインクルード (p: 149-151)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 3.8.2 ソースファイルのインクルード

関連項目

C標準ライブラリヘッダーファイルの一覧
C++ documentation for ソースファイルのインクルード