ソースファイルのインクルード
提供: cppreference.com
< cpp | preprocessor
現在のソースファイルの指令の直後の行に他のソースファイルをインクルードします。
目次 |
[編集] 構文
#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> はエラーを発生するかもしれません。
[編集] 例
Run this code
#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言語リファレンス
|