Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/preprocessor/include"

From cppreference.com
m (Undo revision 93573 by 95.37.148.122 (talk) the text is about optional, not experimental/optional)
Line 31: Line 31:
 
Many compilers also implement the non-standard {{ltt|cpp/preprocessor/impl|pragma}} {{c|#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.
 
Many compilers also implement the non-standard {{ltt|cpp/preprocessor/impl|pragma}} {{c|#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 {{tt|__has_include}} result of {{c|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 {{c|__has_include}} in its C++14 mode as a conforming extension), {{c|__has_include(<experimental/optional>)}} may be {{c|1}} in C++14 mode, but actually {{c|#include <optional>}} may cause an error.
+
A {{tt|__has_include}} result of {{c|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 {{c|__has_include}} in its C++14 mode as a conforming extension), {{c|__has_include(<optional>)}} may be {{c|1}} in C++14 mode, but actually {{c|#include <optional>}} may cause an error.
  
 
===Example===
 
===Example===

Revision as of 07:21, 27 May 2017

 
 
C++ language
General topics
Flow control
Conditional execution statements
if
Iteration statements (loops)
for
range-for (C++11)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications (until C++17*)
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
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
explicit (C++11)
static

Special member functions
Templates
Miscellaneous
 
 

Includes other source file into current source file at the line immediately after the directive.

Contents

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

1,2) Includes source file, identified by filename into the current source file at the line immediately after the directive. In the case the file is not found, program is ill-formed.
1) Searches for the file in implementation-defined manner. The intent of this syntax is to search for the files under control of the implementation. Typical implementations search only standard include directories. 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.
2) Searches for the file in implementation-defined manner. The intent of this syntax is to search for the files that are not controlled by the implementation. Typical implementations first search the directory where the current file resides and, only if the file is not found, search the standard include directories as with (1).
3) Preprocessor constant expression that evaluates to 1 if the file name is found and 0 if not. The program is ill-formed if the argument would not be a valid argument to the #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>) && __cplusplus > 201402L
#  include <optional>
#  define have_optional 1
#elif __has_include(<experimental/optional>) && __cplusplus >= 201402L
#  include <experimental/optional>
#  define have_optional 1
#  define experimental_optional 1
#else
#  define have_optional 0
#endif
 
#ifndef TEXT
    #include <iostream>
 
    int main()
    {
    #define TEXT "Hello, world!"
    #include __FILE__
    #define TEXT "Hello again!"
    #include __FILE__
 
    }
#else
    std::cout << TEXT << '\n';
    #undef TEXT
#endif

Output:

Hello, world!
Hello again!

See also

cpp/header a list of C++ Standard Library header files
C documentation for Source file inclusion