不同包含路径中的相等头文件

时间:2013-05-30 09:24:31

标签: c++ header-files include-path

假设我们有两个标头文件:/directory1/A.hppdirectory2/A.hpp。这两个标题的内容是不同

我们的构建目标A.cpp需要directory1directory2作为包含路径,因为两个目录中还有其他所需的头文件。

现在,在A.cpp中有一个#include "A.hpp"声明。

预处理器选择哪个版本的A.hpp

如果一个人使用第三方软件,那么这种情况可能会发生吗?

4 个答案:

答案 0 :(得分:10)

在这种情况下会发生什么情况取决于所讨论的编译器(请参阅您使用的编译器的文档)。

这样的情况是使用“不合格”标题名称通常是个坏主意的原因。始终构建包含目录,以使路径的一部分成为名称的必要组件。 E.g。

#include <boost/preprocessor.hpp>
#include <gl/GL.h>

而不是

#include <preprocessor.hpp>
#include <GL.h>

答案 1 :(得分:4)

带双引号的include指令粘贴以其文字形式引用的文件。文件路径被认为是相对于源文件位置。

所以,如果你有#include "directory1/A.hpp",它将包括明显的一个。如果您#include <A.hpp>#include "A.hpp",则取决于您的搜索路径中首先出现的内容。

通常,您应该具有特定的描述性名称以防止争用。以与使用C ++命名空间相同的方式使用目录是一种不错的做法。查看libxml ++和gtkmm等库的结构。

答案 2 :(得分:3)

这取决于您的编译选项,尤其是您的包含路径。

如果directory1在include路径中,它将是/directory1/A.hpp,否则如果directory2在include路径中,则它将是/directory2/A.hpp。 如果directory1和directory2都在include路径中,编译器会要求您指定目录,如#include "directory1/A.hpp"

答案 3 :(得分:1)

编译器按照包含目录列为-I的参数的顺序选择包含文件。使用找到的第一个文件。

如果有两个具有相同名称的文件,则应在源文件中指定所需的文件。