0
这篇主要介绍下头文件的路径问题。

首先,看看下面两个头文件引用,哪个是正确的:

#include <iostream>
#include "iostream"
有人会推荐你用前一个即<>,其实两个都是正确的,都能正确引用到这个头文件,那么区别在哪?

VS的推荐路径不同,现在VS都有一个功能叫intellisense,如下:



这个主要帮我们快速完成代码,上图中的每一项功能都非常实用,现在主要说下第一个功能“列出成员”。当你在<>中间输入ios的时候,vs会给你推荐符合这个前缀的头文件,如下:

你可以通过上下选择后按Tab键让VS帮你快速完成代码,很像当时的VA(一款VS插件)。如果你用的是“”,VS则不会给你推荐“iostream”。所以问题来了:是什么决定VS在哪个路径下搜索头文件?

答案就是项目属性中的VC++目录。我们先看下VC++里面和头文件引用相关的部分,就是这个包含目录:



我的 iostream 头文件是在 $(VC_IncludePath)的文件夹下面,所以在使用#include<>的时候VS会在这个途径下推荐接近的头文件。从上图可以看到我们创建项目后并没有主动添加路径到这个包含目录里面,而是直接继承了 $(VC_IncludePath)和$(WindowsSDK_IncludePath)这两个值。要说到它们怎么来的,这就要讲到VS的另一个重要的管理器——属性管理器。

来看下属性管理器:



看上图,Debug|Win32下面有四个属性表依次(从下往上)是:Core Windows Libraries,Multi-byte Character Support,Application,Microsoft.Cpp.Win32.user。还记得之前我们说的配置管理器里的Debug和Release吗?如果Debug在没有用户更改默认属性的情况下,debug其实等价于把这四个属性表拼起来,每一个属性表都表示属性页里面的一部分信息,比如看下Core Windows Libraries这个属性表:



从上面可以看到这个属性表其实加载的是程序所需要的系统32位dll的lib链接。上面四个属性表就对应了我们的这个项目的属性组合:C++、Win32、多字节。但是, $(VC_IncludePath)和$(WindowsSDK_IncludePath)不是被它们加入到项目,真正加入这两个东西的也是一个.props文件,叫Toolset.props。为什么在属性管理器里面看不到这个属性表呢,因为它加载的方式比较特殊,是在.vcxproj文件里面加载的,如下:



上图是.vcxproj文件的一个片段,这一句<Import .... .props />就是加载属性表的另一种方式。我这里并没有把怎么一步步链接到Toolset.props的过程记录下来,因为每个属性表里面还有很多加载属性表的语句,层层嵌套。总之就是VS根据我们选择的工具集版本,也就是VS2017(v141),最终加载到Toolset.props,下面是这个属性表的部分代码:



如上图标注的内容,VC++目录下的所谓继承的值都来自这里。

好,这下我们可以理解#include<>的搜索路径是VC++目录的包含目录,那“”中的路径位置又在哪里呢?就在下图中的附加包含目录:





结论:“”的搜索路径是保存在C/C++的附加包含目录里,而<>是在VC++目录的包含目录中。所以,你如果不想自己的头文件和一大堆Windows的标准库文件混在一起的话,那就在附加包含目录里添加你自己的include文件夹,并且在使用的时候用#include“”.

 

最后讲一个题外话,为什么是#include<iostream>,这个iostream文件为什么这么厉害都不用.h后缀也可以被编译器当成头文件来读取。其实头文件对后缀名没有任何要求,你可以是任意后缀,或者像iostream一样不加后缀,都可以编译。只要你的文本格式和语法和头文件一样就行,你看我改成.x文件也可以编译运行:



如果你把头文件名字改成标准库中一样如:algorithm,ios,iostream,那你还能享受VS的语法高亮待遇:



好,本章就到这里。
————————————————
版权声明:本文为CSDN博主「Mr_L_Y」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luoyu510183/article/details/83795054
关闭 返回顶部
联系我们
Copyright © 2011. 聚财吧. All rights reserved.