#include指令:相对于哪里?

时间:2009-03-14 01:47:29

标签: c++ include c-preprocessor

我查看了 C ++编程语言,试图找到答案。当我在标题中#include "my_dir/my_header.hpp"时,它在哪里查找此文件?相对于包含它的源文件或其他内容,它是相对于标题吗?

6 个答案:

答案 0 :(得分:25)

答案 1 :(得分:9)

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

答案 2 :(得分:7)

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

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

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

Angle-bracket形式:此表单指示预处理器首先沿/ I编译器选项指定的路径搜索包含文件,然后在从命令行编译时,沿INCLUDE环境变量指定的路径搜索。 / p>

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

此信息应位于特定C ++预处理程序参考的文档中,上述内容摘自this article on MSDN,其中有更多关于此主题的内容。

答案 3 :(得分:2)

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

  

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

答案 4 :(得分:1)

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

我知道gcc / g ++提供-I标志。所以你可以使用g ++ -I / home [...]  表示xxy.hpp文件位于/ home / my_dir /目录中。 我现在还没有使用过任何其他C / C ++编译器。

答案 5 :(得分:0)

对于GCC版本&lt; = 3.0,角括号形式不会在包含文件和包含文件之间生成依赖关系。 因此,如果您希望makefile自动生成依赖项,则必须使用引用的表单来存储应该包含在依赖关系树中的文件。