【问题标题】:#include directive: relative to where?#include 指令:相对于哪里?
【发布时间】:2010-10-13 07:25:49
【问题描述】:

我查看了C++ 编程语言 试图找到这个问题的答案。当我在标题中#include "my_dir/my_header.hpp" 时,它在哪里寻找这个文件?它是相对于标题、相对于包含它的源文件还是其他什么?

【问题讨论】:

标签: c++ include c-preprocessor


【解决方案1】:

完整的搜索路径可能取决于编译器。对于 Visual Studio,the documentation 声明它:

(...) 指示预处理器在包含 #include 语句的文件的同一目录中查找包含文件,然后在包含 (#include) 该文件的任何文件的目录中查找包含文件。然后预处理器沿着 /I 编译器选项指定的路径搜索,然后沿着 INCLUDE 环境变量指定的路径搜索。

【讨论】:

    【解决方案2】:

    对于 GCC 版本

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      定义了它的实现。文件(例如 foo.h)上的那些 #include"my_dir/xxy.hpp" 与文件相关(foo.h 和 my_dir 在目录层次结构中处于同一级别)。 对于某些(大多数?)编译器,您可以使用标志来使用这些 (#include

      我知道 gcc / g++ 提供了 -I 标志。所以你可以使用 g++ -I /home [...] 表示xxy.hpp文件位于/home/my_dir/目录下。 我已经有一段时间没有使用任何其他 C/C++ 编译器了。

      【讨论】:

        【解决方案5】:

        这取决于您在#include 指令中使用的语法:

        #include "path-spec"
        #include <path-spec>
        

        引用形式:此形式指示预处理器在包含#include 语句的文件的同一目录中查找包含文件,然后在包含(#include)该文件的任何文件的目录中查找。然后预处理器沿着 /I 编译器选项指定的路径搜索,然后沿着 INCLUDE 环境变量指定的路径搜索。

        尖括号形式:这种形式指示预处理器首先沿着 /I 编译器选项指定的路径搜索包含文件,然后在从命令行编译时,沿着 INCLUDE 环境变量指定的路径搜索。

        path-spec 是一个文件名,前面有一个目录规范。文件名必须命名现有文件。 path-spec 的语法取决于编译程序的操作系统。

        此信息应在您的特定 C++ 预处理器参考的文档中,以上内容来自this article on MSDN,其中包含更多关于该主题的信息。

        【讨论】:

        • 你应该说明这是哪个实现(编译器)。
        • @aib:谢谢 - 该信息来自引用的 MSDN 链接,并且特定于 Microsoft 的 Visual Studio 2005 预处理器。 (非常相似的)Visual Studio 2008 版本可以在 msdn.microsoft.com/en-us/library/36k2cdd4.aspx 找到
        • 是否“-然后在包含(#include)该文件的任何文件的目录中。”,意味着`#include“foo/bar.h”将搜索所有文件的目录包含 bar.h 的项目?措辞让我有点困惑,所以我只想 100% 清楚。
        • @batbrat:对于“嵌套”包含它搜索:“在当前打开的包含文件的目录中,以打开它们的相反顺序。搜索从父包含的目录开始文件并继续向上通过任何祖父包含文件的目录。"
        【解决方案6】:

        它相对于当前源文件和任何给定的搜索路径(-I 表示 gcc)。

        【讨论】:

          猜你喜欢
          • 2015-02-26
          • 1970-01-01
          • 2014-11-23
          • 1970-01-01
          • 2014-04-02
          • 1970-01-01
          • 1970-01-01
          • 2018-04-30
          • 1970-01-01
          相关资源
          最近更新 更多