include引入头文件规则
语法定义
C++中include
关键字用于引入其他头文件。在程序处于预处理
阶段时,会将目标引入的头文件的内容添加该指令的位置。引入语法见如下2种方式:
// 语法1
#include <example_header1>
// 语法2
#include "example_header2"
- 语法1会搜索由
example_header1
唯一识别的标头,并将该指令替换为这个标头的全部内容。在一系列由实现定义的地点中搜索由example_header1
唯一识别的标头,并将该指令替换为这个标头的全部内容。由实现定义如何制指定这些地点和识别标头。 - 语法2会搜索由
example_header2
识别的源文件,并将该指令替换为这个源文件的全部内容。可能退回至方式1并将example_header2
视为标头标识符,将该指令替换为由example_header2
识别的源文件的全部内容。所指名的源文件通过由实现定义的方式进行搜索。如果不支持这种搜索或者搜索失败,该指令按语法1重新处理,将原指令中包含的序列(包括大于号,如果存在)作为语法1中所需的序列。
内容参考链接:
源文件包含 - cppreference.com
GCC-11.4.0实现
以上两种语法所使用的头文件搜索路径由具体编译器实现定义,目前C++项目开发主要使用GCC
作为主要编译工具链。GCC
对于include
语法实现规则如下:
- 对于
#include <file>
语法:用于引入系统头文件,它在系统目录的标准列表中搜索文件名文件,可以在编译时使用-I
选项将目录前置到该列表中。对于Ubuntu系统而言,系统默认搜索路径为/usr/include
与/usr/local/include
。 - 对于
#include "file"
语法:用于自己项目的头文件,它在当前文件所在目录搜索文件名文件,可以在编译时使用-iquote
选项将自定义目录添加至搜索目录;如果搜索失败,则会退化为include <file>
方式继续搜索。
#include
的参数,无论是用引号还是尖括号分隔,其行为都像字符串常量,因为注释无法识别,宏名称也无法展开。因此,#include<x/*y>
指定包含名为x/*y
的系统头文件。但,若反斜杠出现在文件中,它们将被视为普通文本字符,而不是转义字符。不处理任何适用于C中字符串常量的字符转义序列。因此,#include "x\n \\y"
指定一个包含三个反斜杠的文件名(有些系统将“\”
解释为路径名分隔符。所有这些系统也以相同的方式解释“/”
。仅使用“/”
最便于移植。)。如果文件名后面的行中有任何内容(注释除外),则为错误。
内容参考链接:
Include Syntax (The C Preprocessor)