6.10.3 源文件包含
约束
#include指令必须标识一个实现能够处理的头文件或源文件。
语义
- 形如
c
#include <h-char-sequence>1
的预处理指令,会在一组实现定义的位置中搜索由 < 与 > 之间的序列唯一标识的头文件,并用该头文件的全部内容替换这条指令。搜索位置如何指定、头文件如何标识,都是实现定义的。
- 形如
c
#include "q-char-sequence"1
的预处理指令,会用由 " 分隔符之间的序列所标识的源文件全部内容替换这条指令。这个源文件的搜索方式是实现定义的。如果实现不支持这种搜索,或者搜索失败,那么该指令会按如下形式重新处理:
c
#include <h-char-sequence>1
其中内部序列与原指令完全相同,包括其中可能出现的 > 字符。
- 还允许使用形如
c
#include pp-tokens1
但又不匹配前两种形式的预处理指令。此时,include 后面的预处理记号会像普通文本那样处理。当前被定义为宏名的每个标识符,都会替换为其替换列表。所有替换完成后,得到的指令必须匹配前两种形式之一。位于一对 < 与 > 预处理记号之间、或者一对 " 字符之间的预处理记号序列,如何合成为单个头名预处理记号,是实现定义的。
- 对于由一个或多个非数字字符或数字组成、后跟一个句点
.和单个非数字字符的序列,实现必须提供唯一映射。第一个字符不得是数字。实现可以忽略字母大小写差异,并且可以把句点前的有效字符数限制为8个。 - 由某个文件中的
#include指令读入的源文件中,还可以继续出现#include预处理指令,但其嵌套层数可以受实现定义上限限制,见5.2.5.2。
示例
示例 1
最常见的 #include 写法如下:
c
#include <stdio.h>
#include "myprog.h"1
2
2
示例 2
下面演示了经宏替换后形成的 #include 指令:
c
#if VERSION == 1
#define INCFILE "vers1.h"
#elif VERSION == 2
#define INCFILE "vers2.h" // 以此类推
#else
#define INCFILE "versN.h"
#endif
#include INCFILE1
2
3
4
5
6
7
8
2
3
4
5
6
7
8