[C++]C++引用 #include用法

本文详细解释了C++中尖括号和双引号在包含头文件时的不同,包括搜索范围、VisualStudio中的设置和可能遇到的问题。强调了添加包含目录的重要性以及搜索顺序的规则。
摘要由CSDN通过智能技术生成

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文件

使用#include ""系统会显示当前目录下的文件,但实际上也是可以包含系统目录里头文件的,只不过在编译器内没有显示而已。

由于test.h是我们在工程当中新创建的头文件,且位于main.cpp同一目录下,只能使用#include "test.h"来包含该文件。

#include "test.h"   // Project\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 "" 总是从当前目录开始,然后搜索包含目录。两种搜索方式总是在找到对应文件的那一刻停止。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FL1768317420

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

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

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

打赏作者

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

抵扣说明:

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

余额充值