General topics | ||||||||||||||||
Flow control | ||||||||||||||||
Conditional execution statements | ||||||||||||||||
Iteration statements (loops) | ||||||||||||||||
Jump statements | ||||||||||||||||
Functions | ||||||||||||||||
Function declaration | ||||||||||||||||
Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
Exceptions | ||||||||||||||||
Namespaces | ||||||||||||||||
Types | ||||||||||||||||
Specifiers | ||||||||||||||||
| ||||||||||||||||
Storage duration specifiers | ||||||||||||||||
Initialization | ||||||||||||||||
Expressions | ||||||||||||||||
Alternative representations | ||||||||||||||||
Literals | ||||||||||||||||
Boolean -Integer -Floating-point | ||||||||||||||||
Character -String -nullptr(C++11) | ||||||||||||||||
User-defined(C++11) | ||||||||||||||||
Utilities | ||||||||||||||||
Attributes(C++11) | ||||||||||||||||
Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
Type alias declaration(C++11) | ||||||||||||||||
Casts | ||||||||||||||||
Memory allocation | ||||||||||||||||
Classes | ||||||||||||||||
Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
(C++23)(C++23) | ||||
#include__has_include (C++17) | ||||
(C++23) | ||||
(C++11) | ||||
(C++26) |
Includes other source file into current source file at the line immediately after the directive.
Contents |
#include < h-char-sequence> new-line | (1) | ||||||||
#include " q-char-sequence" new-line | (2) | ||||||||
#include pp-tokensnew-line | (3) | ||||||||
__has_include ( " q-char-sequence" ) __has_include ( < h-char-sequence> ) | (4) | (since C++17) | |||||||
__has_include ( string-literal) __has_include ( < h-pp-tokens> ) | (5) | (since C++17) | |||||||
new-line | - | The new-line character |
h-char-sequence | - | A sequence of one or moreh-char s, where the appearance of any of the following is conditionally-supported with implementation-defined semantics:
|
h-char | - | Any member of thesource character set(until C++23)translation character set(since C++23) except new-line and> |
q-char-sequence | - | A sequence of one or moreq-char s, where the appearance of any of the following is conditionally-supported with implementation-defined semantics:
|
q-char | - | Any member of thesource character set(until C++23)translation character set(since C++23) except new-line and" |
pp-tokens | - | A sequence of one or morepreprocessing tokens |
string-literal | - | Astring literal |
h-pp-tokens | - | A sequence of one or morepreprocessing tokens except> |
include
in the directive are processed just as in normal text (i.e., each identifier currently defined as a macro name is replaced by its replacement list of preprocessing tokens).__has_include
expression evaluates to1 if the search for the source file succeeds, and to0 if the search fails.If the header identified by theheader-name (i.e.,
| (since C++20) |
__has_include
can be expanded in the expression of#if and#elif. It is treated as a defined macro by#ifdef,#ifndef,#elifdef,#elifndef(since C++23) anddefined but cannot be used anywhere else.
Typical implementations search only standard include directories for syntax(1). The standard C++ library and the standard C library are implicitly included in these standard include directories. The standard include directories usually can be controlled by the user through compiler options.
The intent of syntax(2) is to search for the files that are not controlled by the implementation. Typical implementations first search the directory where the current file resides then falls back to(1).
When a file is included, it is processed bytranslation phases 1-4, which may include, recursively, expansion of the nested#include directives, up to an implementation-defined nesting limit. 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-standardpragma#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 sequence of characters that resembles an escape sequence inq-char-sequence orh-char-sequence might result in an error, be interpreted as the character corresponding to the escape sequence, or have a completely different meaning, depending on the implementation.
A__has_include
result of1 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 be1 in C++14 mode, but actually#include <optional> may cause an error.
#if __has_include(<optional>)#include <optional>#define has_optional 1template<class T>using optional_t=std::optional<T>;#elif __has_include(<experimental/optional>)#include <experimental/optional>#define has_optional -1template<class T>using optional_t=std::experimental::optional<T>;#else#define has_optional 0template<class V>class optional_t{ V v{};bool has{}; public: optional_t()=default; optional_t(V&& v): v(v), has{true}{} V value_or(V&& alt)const&{return has? v: alt;}// etc.};#endif #include <iostream> int main(){if(has_optional>0)std::cout<<"<optional> is present\n";elseif(has_optional<0)std::cout<<"<experimental/optional> is present\n";elsestd::cout<<"<optional> is not present\n"; optional_t<int> op;std::cout<<"op = "<< op.value_or(-1)<<'\n'; op=42;std::cout<<"op = "<< op.value_or(-1)<<'\n';}
Output:
<optional> is presentop = -1op = 42
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 787 | C++98 | the behavior is undefined if an escape sequence is resembled inq-char-sequence orh-char-sequence | it is conditionally-supported |
A list of C++ Standard Library header files | |
C documentation forSource file inclusion |