ソースファイルのインクルード
現在のソースファイルの指令の直後の行に他のソースファイルをインクルードします。
構文
#include <filename>
|
(1) | ||||||||
#include "filename"
|
(2) | ||||||||
__has_include ( " filename " )__has_include ( < filename > )
|
(3) | (C++17以上) | |||||||
任意のプリプロセッサトークン (マクロ定数または式) は、 < > または " " によって囲まれた文字の並びに展開される限り、 #include および __has_include (C++17以上) への引数として認められます。
説明
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
