C++入门到放弃(01)——引用 #include

1.前言

C++中包含头文件存在两种不同的形式,尖括号<>和双引号"",其区别在于搜索范围和搜索顺序。

以Visual Studio 2022为例,我们创建一个工程,在里面添加主函数main.cpp的文件,以及头文件test.h

Project

├── main.cpp

└── test.h

 

2.搜索范围

<>只可以访问 系统目录下的头文件(.h),""可以访问 当前文件相对路径 + 系统目录下的头文件(.h) 。

使用#include <>系统会只会显示并搜索系统目录里的头文件。

 因此#include <test.h>会报错。

 

#include <test.h> // 错误,在标准库内找不到test.h文件

 

3.添加包含目录

通常我们的源码不可能全部在同一目录下,这样不利于代码后续的维护,可读性也会变得非常糟糕,因此需要添加包含目录。例如将整个工程源码的最外层添加进来,这样后续所有的include都可以从工程的入口找到对应的头文件源码。

对于Visual Studio,在 项目->属性->配置属性->C/C++->常规->附加包含目录。​

 

4.搜索顺序

附加包含目录允许添加多个,且C++也允许包含相同名字的头文件。

这样就会带来一个问题,如果相同地址下存在相同名字的头文件,会出现头文件包含错误的问题,这是由没搞清#inlcude包含顺序所导致。

首先给出搜索顺序的结论:

#inlcude <> 从包含目录开始,按照顺序依次查找,最后到系统目录。

#include "" 从当前目录开始,然后是包含目录,按照顺序依次查找,最后到系统目录。

常见的几个问题,以如下文件结构举例,addr1和addr2是文件夹名称,都添加进附加包含目录内。

 

Project

├── main.cpp

├── addr1

        ├── test.h

├── addr2

        ├── test.h

└── test.h

1.某个同名头文件存在于多个包含目录的相同地址下,那么在搜索路径排在后面的文件就不会被包含,例如:

addr1和addr2都被添加进附加包含目录,那么对于main.cpp来说,addr2下的test.h就没有办法被直接包含。

2.由于搜索优先级的原因,会导致<>和""所包含的头文件不同,使用时应当注意。

 

#include <test.h>   // Project\addr1\test.h
#include "test.h"   // Project\test.h

通常尽可能少的将乱七八糟的地址添加进目录当中,例如只将整个工程的源码入口加入到附加包含目录,或者从更改命名规范上来屏蔽这类问题。

5.总结

搜索空间上: #include "" 大于 #inlcude <>,因为#include "" 总是会搜索当前路径。

搜索顺序上: #inlcude <> 总是从包含目录开始,#inlcude "" 总是从当前目录开始,然后搜索包含路径,两种搜索方式总是在找到对应文件的那一刻停止。

对于那些既可以使用""也可使用<>编译的头文件,例如标准库文件,建议使用<>,而当前目录下的文件可以省去前面的长串相对地址,这样可以在一定程度上提高代码的编译效率。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值