【问题标题】:Where does Visual Studio's compiler search for #includes?Visual Studio 的编译器在哪里搜索#include?
【发布时间】:2012-03-01 17:45:20
【问题描述】:

如果我只是通过写来包含一个文件

#include "blah.h"

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

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

基本上我不了解您如何在结构中导航。我见过一些看起来像这样的包含:

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

这些点是什么意思?它们会回升,但不同的数字是否意味着不同的东西?

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

非常感谢您对此的帮助,我知道这是一个基本的问题 - 只是我从未学过的东西之一。

【问题讨论】:

  • 项目属性下有个设置,叫做“包含目录”(vs不同版本在不同的子分支下,vs2010在配置属性->VC++目录下)。 “include”中的点总是根据磁盘上文件的结构备份,从包含它们的源文件的位置开始(如果在那里找不到,则从每个目录的位置开始搜索) “包括目录”,但同样是磁盘上的物理位置。

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


【解决方案1】:

来自visual studio documentation on #include


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

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

  2. 在任何以前打开的包含文件的目录中,它们的打开顺序与打开顺序相反。搜索从最后打开的包含文件的目录开始,一直到最先打开的包含文件的目录。

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

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


您可以通过 Visual Studio 项目设置中的 /I 选项(用于项目特定路径)和 Visual Studio 选项中的全局路径更改传递给编译器的路径。

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

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

【讨论】:

    【解决方案2】:

    当您在a.cpp 中写入#include "a.h" 时,预处理器会在a.cpp 所在的同一目录中搜索a.h。如果不支持此搜索,或者搜索失败,则预处理器会在一系列实现定义的位置中搜索此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"?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多