源文件包含

来自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 :若已包含同一文件(这里以 OS 限定的方式确定文件身份),则它禁止处理该文件。

1__has_include 结果只表示是否存在有指定名称的头或源文件。它不表示包含该头或源文件时,会导致错误或是会包含任何有意的内容。例如在一同支持 C++14 和 C++17 模式(并在其 C++14 模式作为一致的扩展提供 __has_include )的 C++ 实现上, __has_include(<optional>) 在 C++14 模式中可为 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
 
#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 文档