名前空間
変種
操作

ソースファイルのインクルード

提供: cppreference.com
 
 
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
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

現在のソースファイルの指令の直後の行に他のソースファイルをインクルードします。

目次

[編集] 構文

#include <filename> (1)
#include "filename" (2)
__has_include ( " filename " )
__has_include ( < filename > )
(3) (C++17以上)

任意のプリプロセッサトークン (マクロ定数または式) は、 < > または " " によって囲まれた文字の並びに展開される限り、 #include および __has_include (C++17以上) への引数として認められます。

[編集] 説明

1,2) 現在のソースファイルの指令の直後の行に filename によって表されるソースファイルをインクルードします。 ファイルが見つからない場合、プログラムは ill-formed です。
1) ファイルを処理系定義の方法で検索します。 この構文の意図は処理系の制御下にあるファイルを検索することです。 一般的な処理系は標準のインクルードディレクトリのみを検索します。 標準 C++ ライブラリおよび標準 C ライブラリはこれら標準のインクルードディレクトリに暗黙に含まれます。 標準のインクルードディレクトリは、通常、コンパイラオプションを通してユーザが制御できます。
2) ファイルを処理系定義の方法で検索します。 この構文の意図は処理系の制御下にないファイルを検索することです。 一般的な処理系は現在のファイルが存在するディレクトリをまず検索し、見つからなかった場合にのみ、 (1) と同様に標準のインクルードディレクトリを検索します。
3) ファイル名が見つかった場合は 1、そうでなければ 0 に評価されるプリプロセッサ定数式。 引数が #include 指令に対する有効な引数でなければ、プログラムは ill-formed です。

[編集] ノート

ファイルがインクルードされるとき、それは翻訳フェーズ1〜4で処理されます。 ネストした #include の展開を再帰的に含むこともあります。 同じファイルのインクルードの繰り返しや自分自身をインクルードしたときの無限再帰を回避するため、ヘッダガードがよく使用されます。 ヘッダ全体が以下のようにラップされます。

#ifndef FOO_H_INCLUDED /* ファイル名に対応する任意の一意な名前 */
#define FOO_H_INCLUDED
// ここにファイルの内容を書きます
#endif

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

__has_include の結果が 1 であることは、指定された名前のヘッダまたはソースファイルが存在することを意味するだけです。 インクルードしたときにエラーが発生しないとか、何か役に立つものを含んでいるといったことは意味しません。 例えば、 C++14 と C++17 の両方のモードをサポートする (そして準拠した拡張として C++14 モードで __has_include を提供する) 処理系において、 C++14 モードで __has_include(<optional>)1 になるかもしれませんが、実際には #include <optional> はエラーを発生するかもしれません。

[編集]

#if __has_include(<optional>)
#  include <optional>
#  define have_optional 1
#elif __has_include(<experimental/optional>)
#  include <experimental/optional>
#  define have_optional 1
#  define experimental_optional 1
#else
#  define have_optional 0
#endif
 
#include <iostream>
 
int main()
{
    if (have_optional)
        std::cout << "<optional> is present.\n";
 
    int x = 42;
#if have_optional == 1
    std::optional<int> i = x;
#else
    int* i = &x;
#endif
    std::cout << "i = " << *i << '\n';
}

出力例:

<optional> is present.
i = 42

[編集] 関連項目

cpp/header C++ 標準ライブラリのヘッダファイルの一覧
ソースファイルのインクルードC言語リファレンス