如果我只是通过编写
来包含文件#include "blah.h"
编译器究竟在哪里搜索此文件?我知道有一些限制。
如果文件不在同一文件夹中,但结构更深入会发生什么情况,如何告诉编译器在那里?同样,如果它高于目录中的文件?或者更深入一个不同的分支?
基本上我没有掌握你如何在结构中导航。我见过一些包含类似的内容:
#include ".././foo/whatever/blah.h"
点是什么意思?他们回去了,但不同的数字意味着不同的东西?
这也是基于计算机上文件的结构或解决方案资源管理器中的结构吗?
非常感谢你对这一点的帮助,我理解这是一个基本问题 - 只是我从未学过的一件事。
答案 0 :(得分:2)
来自visual studio documentation on #include
预处理器按以下顺序搜索包含文件:
与包含#include语句的文件位于同一目录中。
在任何先前打开的包含文件的目录中,按照与打开它们相反的顺序。搜索从最后打开的包含文件的目录开始,然后继续通过首先打开的包含文件的目录。
沿着每个/ I编译器选项指定的路径。
沿着INCLUDE环境变量指定的路径。
您可以通过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"?