源文件包含

来自cppreference.com
 
 
C++ 语言
 
 

在紧跟这条指令后面的行中将其他源文件包含到当前源文件之中。

目录

[编辑] 语法

#include <文件名> (1)
#include "文件名" (2)
__has_include ( " 文件名 " )
__has_include ( < 文件名 > )
(3) (C++17 起)

任何预处理记号(宏常量或者表达式)都允许用作 #include __has_include (C++17 起)的实参,只要它们扩展为以 < > 或者 " " 所包围的字符序列即可。

[编辑] 解释

1,2) 在紧跟指令后面的行中将由文件名所指定的源文件包含到当前源文件中。如果该文件未找到,则程序非良构。
1) 以由实现定义的方式寻找文件。这种语法的意图是为了寻找由实现所控制的文件。典型的实现只会寻找一些标准的包含目录。这些标准包含目录中隐含地包含 C++ 标准库和 C 标准库。用户通常可以通过使用编译器选项来控制标准包含目录。
2) 以由实现定义的方式寻找文件。这种语法的意图是为了寻找并非由实现所控制的文件。典型的实现首先会寻找源文件所在的目录,然后仅当未找到文件时,再如 (1) 一样搜索标准包含目录。
3) 预处理器常量表达式,如果找到了文件名则求值为 1,否则为 0。如果其实参对于 #include 指令不是有效的实参,则程序非良构。

[编辑] 注解

当包含一个文件时,将进行翻译阶段 1 到 4 的处理,其中将递归地包括对其中嵌套的 #include 指令的扩展。为了避免相同文件被重复包含,和当文件(可能传递性地)包含自身时的无限递归,通常会使用头文件防护:整个头文件被包含到:

#ifndef FOO_H_INCLUDED /* 任何可唯一对应到文件名的名字 */
#define FOO_H_INCLUDED
// 这里是文件的内容
#endif

许多编译器也实现了非标准的 pragma #pragma once 并具有相似的效果:当同一个文件(文件的识别是以特定于操作系统的方式所确定的)已经被包含过时,它将关闭对该文件的处理。

[编辑] 示例

#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
 
#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

输出:

Hello, world!
Hello again!

[编辑] 另请参阅

cpp/header C++ 标准库头文件的列表
源文件包含C 文档