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

这篇具有很好参考价值的文章主要介绍了C++入门到放弃(01)——引用 #include。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.前言

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

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

Project

├── main.cpp

└── test.h

2.搜索范围

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

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

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

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

#include <test.h> // 错误,在标准库内找不到test.h文件
C++入门到放弃(01)——引用 #include

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

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

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

#include "test.h" // Project\test.h

3.添加包含目录

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

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

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

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

对于那些既可以使用""也可使用<>编译的头文件,例如标准库文件,建议使用<>,而当前目录下的文件可以省去前面的长串相对地址,这样可以在一定程度上提高代码的编译效率。文章来源地址https://www.toymoban.com/news/detail-592196.html

到了这里,关于C++入门到放弃(01)——引用 #include的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx

    这道纯粹记录 完全没想到 存在文件包含漏洞 过滤 data 等常见利用协议 然后我们看看能读取啥东西 发现啥都可以 那我们通过 这里泄露了中间件 那么我们直接去搜 发现存在一个文件日志包含漏洞 看了看就是会解析php 所以直接传递参数即可传递一个phpinfo 成功执行 那么就直

    2024年02月06日
    浏览(48)
  • 【CSDN话题】C++从放弃到入门

            C++(c plus plus)是一种计算机高级程序设计语言,既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。 1954年,世界上第一种计算机高级语言 FORTRAN 诞生。 1969年前

    2024年02月08日
    浏览(38)
  • C++ 中到底是应该include .h文件还是应该include .cpp文件

    在阅读一个较大的解决方案中,对于其他文件夹下的.h和.cpp文件,有时候#include“XXX.h”文件,有时候是#include“XXX.cpp”文件,而且二者还不能更换。下面就好好分析一下他们二者的区别。          如果 .h 文件和 .cpp 文件都已经添加在解决方案里,只要在 main 的头文件中

    2024年02月05日
    浏览(51)
  • 【C++从入门到放弃】模板介绍(函数模板、类模板)

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   以我们之前所学的知识,假如要实现一个通用的加法函数,那么可以通过函数重载的方式来实现。 使用函数重载虽

    2023年04月14日
    浏览(45)
  • c++从入门到放弃,小白踩坑记录1

    错误问题描述 没有与这些操作数匹配的运算符操作数类型为std::basic_ostream char,std::char traits char unknown-type 错误代码 错误原因 代码的“end”为错误写发,应该是“endl” 修改后的正确代码

    2024年02月06日
    浏览(46)
  • 【C++从入门到放弃】list深度剖析及模拟实现

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! list 是允许在序列内的任何位置进行 常量时间的插入和删除 操作的序列容器,并且该容器可以前后双向迭代。 list 的底

    2024年02月10日
    浏览(48)
  • 【C++从入门到放弃】vector深度剖析及模拟实现

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! vector 是表示 可变大小数组 的序列容器。 就像数组一样,vector也采用的 连续存储空间 来存储元素。也就是意味着可以

    2024年02月07日
    浏览(49)
  • 【C++从入门到放弃】string全方面分析(常用接口、模拟实现)

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 在学习C++的过程中,必定有一个非常重要的工具就是STL(标准模板库):C++标准库的重要组成部分,它不仅是一个可复

    2024年02月02日
    浏览(50)
  • C++-queue头文件-队列常用函数-#include<queue>新手入门

    队列是在一端允许插入,一端允许删除操作的线性表,是一种先进先出(FIFO)的线性表。在front,即队头,允许删除操作,进行出列操作,在rear,即队尾,允许插入操作,进行入列操作。 在VS编译器中添加queue类,建立队列q 建立队列: queueType, Container (数据类型,容器类型)

    2023年04月09日
    浏览(39)
  • 【C++从入门到放弃】stack和queue的深度剖析及空间适配器的介绍

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   此篇博客将谈及到的stack、queue和priority_queue都不是STL的标准容器,而是一种空间适配器。它是通过对一种容器进行

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包