Visual Studio的编译器在哪里搜索#includes?

时间:2012-03-01 17:45:21

标签: c++ visual-studio visual-c++ include c-preprocessor

如果我只是通过编写

来包含文件
#include "blah.h"

编译器究竟在哪里搜索此文件?我知道有一些限制。

如果文件不在同一文件夹中,但结构更深入会发生什么情况,如何告诉编译器在那里?同样,如果它高于目录中的文件?或者更深入一个不同的分支?

基本上我没有掌握你如何在结构中导航。我见过一些包含类似的内容:

#include ".././foo/whatever/blah.h"

点是什么意思?他们回去了,但不同的数字意味着不同的东西?

这也是基于计算机上文件的结构或解决方案资源管理器中的结构吗?

非常感谢你对这一点的帮助,我理解这是一个基本问题 - 只是我从未学过的一件事。

2 个答案:

答案 0 :(得分:2)

来自visual studio documentation on #include


预处理器按以下顺序搜索包含文件:

  1. 与包含#include语句的文件位于同一目录中。

  2. 在任何先前打开的包含文件的目录中,按照与打开它们相反的顺序。搜索从最后打开的包含文件的目录开始,然后继续通过首先打开的包含文件的目录。

  3. 沿着每个/ I编译器选项指定的路径。

  4. 沿着INCLUDE环境变量指定的路径。


  5. 您可以通过visual studio项目设置中的/ I选项(针对项目特定路径)和全局路径的visual studio选项更改传递给编译器的路径。

    路径中的2个点将您移动到目录中,一个点指向当前目录。任何其他数量的点都无效。因此,.././foo/whatever/blah.h的示例路径实质上意味着“向上移动一个级别,查看文件夹foo,然后在文件夹中查找”。在这种情况下,单点并没有真正做任何事情。

    此导航基于文件结构,而不是解决方案资源管理器中的结构

答案 1 :(得分:1)

当您在#include "a.h"中编写a.cpp时,预处理程序会在a.h所在的同一目录中搜索a.cpp。如果不支持此搜索,或者搜索失败,则预处理器会搜索此a.h的一系列实现定义位置。

“点是什么意思?”
假设你有这个完整路径的文件:C:\myDir\myProjects\a\a.cpp
. = C:\myDir\myProjects\a
.. = C:\myDir\myProjects

您还应该查看What is the difference between #include <filename> and #include "filename"?