我查看了The C++ Programming Language试图找到这个问题的答案。当我#include "my_dir/my_header.hpp"
在标题中时,它在哪里寻找这个文件?它是相对于标题,相对于包含它的源文件还是其他什么?
6 回答
它相对于当前源文件和给定的任何搜索路径(-I 表示 gcc)。
这取决于您在 #include 指令中使用的语法:
#include "path-spec"
#include <path-spec>
引用形式:此形式指示预处理器在包含#include 语句的文件的同一目录中查找包含文件,然后在包含(#include)该文件的任何文件的目录中查找。然后预处理器沿着 /I 编译器选项指定的路径搜索,然后沿着 INCLUDE 环境变量指定的路径搜索。
尖括号形式:这种形式指示预处理器首先沿着 /I 编译器选项指定的路径搜索包含文件,然后在从命令行编译时,沿着 INCLUDE 环境变量指定的路径搜索包含文件。
path-spec 是一个文件名,前面有一个目录规范。文件名必须命名现有文件。path-spec 的语法取决于编译程序的操作系统。
此信息应在您的特定 C++ 预处理器参考的文档中,以上内容来自MSDN 上的这篇文章,其中有更多关于该主题的内容。
其实现已定义。文件(例如 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++ 编译器了。
对于 GCC 版本 <= 3.0,尖括号形式不会在包含文件和包含文件之间生成依赖关系。因此,如果您希望您的 makefile 自动生成依赖项,则必须对应包含在依赖项树中的文件使用带引号的形式。