#include
指令 (C/C++)
告知预处理器在指令出现处包含已指定文件的内容。
语法
#include "
path-spec"
#include <
path-spec>
注解
可以将常数和宏定义编入包含文件(也称为头文件”)中,然后使用 #include
指令将它们添加到任何源文件中。 包含文件还可用于合并外部变量和复杂数据类型的声明。 在为此目的而创建的包含文件中,类型只能定义和命名一次。
path-spec 是一个文件名,可以选择性地在它前面放置一个目录说明。 文件名必须命名现有文件。 path-spec 的语法取决于编译程序时所安装的操作系统。
有关如何在使用 /clr
编译的 C++ 应用程序中引用程序集的信息,请参阅 #using
指令。
两种语法形式都会导致 #include
指令被替换为指定文件的整个内容。 两种形式之间的区别在于,在未完全指定路径时预处理器搜索的路径顺序。 下表显示了这两种语法形式之间的差异。
语法形式 | 操作 |
---|---|
带引号的形式 | 预处理器按以下顺序搜索包含文件: 1) 在包含 #include 语句的文件所在的同一目录中。2) 在当前打开的包含文件的目录中,采用与打开它们的顺序相反的顺序。 搜索从父包含文件的目录中开始进行,然后继续向上到任何祖父包含文件的目录。 3) 跟随每个 /I 编译器选项指定的路径。4) 跟随 INCLUDE 环境变量指定的路径。 |
尖括号形式 | 预处理器按以下顺序搜索包含文件: 1) 跟随每个 /I 编译器选项指定的路径。2) 通过命令行进行编译时,跟随 INCLUDE 环境变量指定的路径。 |
只要找到具有给定名称的文件,预处理器就会停止搜索。 如果在两个双引号 (" "
) 之间括住包含文件的完整明确的路径说明,则预处理器只搜索该路径说明,并忽略标准目录。
如果用双引号括起来的文件名是不完整的路径规格,则预处理器将首先搜索“父”文件的目录。 父文件是包含 #include
指令的文件。 例如,如果在名为“file1”的文件中包含一个名为“file2”的文件,则“file1”是父文件。
包含文件可以“嵌套”:#include
指令可以出现在由另一个 #include
指令命名的文件中。 例如,“file2” 可以包含“file3”。 在这种情况下,“file1”依然是“file2”的父级,但它将是“file3”的祖父级。
当嵌套了包含文件并从命令行开始编译时,目录搜索会从父文件的目录开始。 然后,它在所有祖父文件的目录中继续进行。 即,搜索将相对于包含当前正在处理的源的目录开始。 如果找不到该文件,搜索会移动到由 /I
(附加包含目录)编译器选项指定的目录。 最后,将搜索 INCLUDE
环境变量指定的目录。
在 Visual Studio 开发环境中,将忽略 INCLUDE
环境变量。 改为使用包含目录的项目属性中指定的值。 有关如何在 Visual Studio 中设置包含目录的详细信息,请参阅包括目录和附加包含目录。
此示例使用尖括号显示文件包含:
#include <stdio.h>
此示例将名为 stdio.h
的文件的内容添加到源程序。 尖括号会促使预处理器在搜索由 /I
编译器选项指定的目录之后,搜索由 stdio.h
的 INCLUDE
环境变量指定的目录。
下一个示例用引号形式显示文件包含:
#include "defs.h"
此示例将 defs.h
指定的文件的内容添加到源程序。 双引号意味着,预处理器将首先搜索包含父源文件的目录。
包含文件的嵌套可扩展至 10 个级别。 当处理完嵌套的 #include
后,预处理器将继续在原始源文件中插入封闭的父包含文件。
Microsoft 专用
为了找到要包含的源文件,预处理器首先搜索 /I
编译器选项指定的目录。 如果 /I
选项不存在,或者搜索失败,预处理器会使用 INCLUDE
环境变量来查找尖括号中的任何包含文件。 INCLUDE
环境变量和 /I
编译器选项可以包含使用分号 (;
) 分隔的多个路径。 如果多个目录显示为 /I
选项的一部分或在 INCLUDE
环境变量中,预处理器会按它们出现的顺序搜索它们。
例如,命令
CL /ID:\msvc\include myprog.c
会促使预处理器搜索包含文件(如 stdio.h
)的目录 D:\msvc\include\
。 命令
SET INCLUDE=D:\msvc\include
CL myprog.c
具有同样的作用。 如果两组搜索都失败,则会生成严重的编译器错误。
如果为路径包含冒号的包含文件指定完整的文件名(例如,F:\MSVC\SPECIAL\INCL\TEST.H
),则预处理器会遵循该路径。
对于被指定为 #include "path-spec"
的包含文件,目录搜索从父文件的目录开始,然后在任何祖父文件的目录中继续进行。 也就是说,搜索将相对于包含正在处理的源文件内容的目录开始。 如果没有祖父文件而且仍然找不到该文件,搜索将继续进行,就像文件名被括在尖括号中一样。
结束 Microsoft 专用