#include指令引号与尖括号的区别

版权声明:实不相瞒,我也想成为大佬 https://blog.csdn.net/CV_Jason/article/details/82873142

  参考MS的官方文档,把include的搜索过程整理了一下——
  #include是C/C++的预处理指令(Preprocessor Directive),主要作用是把头文件引入到任意源文件中,在预处理阶段,被包含的文件在源文件的指令地点进行整体替换。#include指令有两种使用格式,分别是:

  #include<path-spec> // Angle bracket form
  #include"path-spec" // Quoted form

  两种不同的指令格式决定了其查找顺序的不同.

尖括号的情况

预处理器按照以下顺序查找包含文件:

  1. 搜索编译器中由\I 指定的每一个路径,如Visual Studio中,在项目属性中可以在C/C++ -> General -> Additional Include Directories中设置;
  在这里插入图片描述
  2. 如果1中没有找到,那么在INCLUDE环境中指定的路径中查找,Visual Studio中可以通过VC++ Directories -> Include Directories设置,这里通常的默认值是Windows Kits环境(一些系统库,如stdio.h)和VS自带的include文件(如iostream);
  在这里插入图片描述
  通常,在这里设置我们自己的include目录以及第三方开源库等(如OpenCV)。
  在这里插入图片描述

双引号的情况

预处理器按照以下顺序查找包含文件:

  1. 先搜索使用#include指令的源文件所在目录;
  2. 在任何先前打开的包含文件中,以打开顺序的逆序进行搜索,即搜索从包含文件所在目录最后被打开的地方开始,到包含路径首次被打开的路径为止;这是我个人的理解,这里的打开可能是要告诉编译器一定的搜索路径,我不是特别懂,希望哪位大神能告诉我T_T;
  3. 从编译器\I指令指定的路径搜索;
  4. 从INCLUDE目录设置的路径进行搜索。
  不难看出,其实双引号的搜索过程是包含尖括号的搜索过程的

总结

  如果是自定义的头文件,必须使用双引号,否则会找不到头文件,出现编译错误;
  如果是系统文件,可以用双引号,也可以用尖括号,但使用双引号会降低搜索效率,而且存在一定风险,当自定义头文件和系统头文件重名时,会把自定义文件作为搜索结果,比如我们自己写一个stdio.h,使用#include"stdio.h",不会得到系统库的调用。

猜你喜欢

转载自blog.csdn.net/CV_Jason/article/details/82873142