Source file inclusion
Includes other source file into current source file at the line immediately after the directive.
Syntax
#include < filename>
|
(1) | ||||||||
#include " filename"
|
(2) | ||||||||
__has_include ( " filename " ) __has_include ( < filename > )
|
(3) | (since C++17) | |||||||
Any preprocessing tokens (macro constants or expressions) are permitted as arguments to #include
and __has_include
(since C++17) as long as they expand to a sequence of characters surrounded by <
>
or "
"
.
Explanation
#include
directive.Notes
When a file is included, it is processed by translation phases 1-4, which may include, recursively, expansion of the nested #include
directives. To avoid repeated inclusion of the same file and endless recursion when a file includes itself, perhaps transitively, header guards are commonly used: the entire header is wrapped in
#ifndef FOO_H_INCLUDED /* any name uniquely mapped to file name */ #define FOO_H_INCLUDED // contents of the file are here #endif
Many compilers also implement the non-standard pragma #pragma once with similar effects: it disables processing of a file if the same file (where file identity is determined in OS-specific way) has already been included.
A __has_include
result of 1 only means that a header or source file with the specified name exists. It does not mean that the header or source file, when included, would not cause an error or would contain anything useful. For example, on a C++ implementation that supports both C++14 and C++17 modes (and provides __has_include in its C++14 mode as a conforming extension), __has_include(<optional>) may be 1 in C++14 mode, but actually #include <optional> may cause an error.
Example
#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'; }
Possible output:
<optional> is present. i = 42
See also
cpp/header | a list of C++ Standard Library header files |