C++ include头文件引入规则

include引入头文件规则

语法定义

C++中include关键字用于引入其他头文件。在程序处于预处理阶段时,会将目标引入的头文件的内容添加该指令的位置。引入语法见如下2种方式:

// 语法1
#include <example_header1>

// 语法2
#include "example_header2"
  1. 语法1会搜索由example_header1唯一识别的标头,并将该指令替换为这个标头的全部内容。在一系列由实现定义的地点中搜索由example_header1唯一识别的标头,并将该指令替换为这个标头的全部内容。由实现定义如何制指定这些地点和识别标头。
  2. 语法2会搜索由example_header2识别的源文件,并将该指令替换为这个源文件的全部内容。可能退回至方式1并将example_header2视为标头标识符,将该指令替换为由example_header2识别的源文件的全部内容。所指名的源文件通过由实现定义的方式进行搜索。如果不支持这种搜索或者搜索失败,该指令按语法1重新处理,将原指令中包含的序列(包括大于号,如果存在)作为语法1中所需的序列。

内容参考链接:
源文件包含 - cppreference.com

GCC-11.4.0实现

以上两种语法所使用的头文件搜索路径由具体编译器实现定义,目前C++项目开发主要使用GCC作为主要编译工具链。GCC对于include语法实现规则如下:

  1. 对于#include <file>语法:用于引入系统头文件,它在系统目录的标准列表中搜索文件名文件,可以在编译时使用-I选项将目录前置到该列表中。对于Ubuntu系统而言,系统默认搜索路径为/usr/include/usr/local/include
  2. 对于#include "file"语法:用于自己项目的头文件,它在当前文件所在目录搜索文件名文件,可以在编译时使用-iquote选项将自定义目录添加至搜索目录;如果搜索失败,则会退化为include <file>方式继续搜索。

#include的参数,无论是用引号还是尖括号分隔,其行为都像字符串常量,因为注释无法识别,宏名称也无法展开。因此,#include<x/*y>指定包含名为x/*y的系统头文件。但,若反斜杠出现在文件中,它们将被视为普通文本字符,而不是转义字符。不处理任何适用于C中字符串常量的字符转义序列。因此,#include "x\n \\y"指定一个包含三个反斜杠的文件名(有些系统将“\”解释为路径名分隔符。所有这些系统也以相同的方式解释“/”。仅使用“/”最便于移植。)。如果文件名后面的行中有任何内容(注释除外),则为错误。
内容参考链接:
Include Syntax (The C Preprocessor)

posted @ 2024-04-29 15:59  漫山华  阅读(33)  评论(0编辑  收藏  举报