2013-05-30 45 views
2

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

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

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

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

如果一个人使用第三方软件,可能会出现这种情况吗?

+1

我认为编译器只是用文件的内容替换了'#include'行,所以名称无关紧要。 – Djon

+1

如果您使用'#pragma once'或包含守卫,则无关紧要,因为内容只会插入一次。 –

+0

对不起,忘记提及如果两个头文件不同,会发生什么情况,请参阅编辑。 – Juergen

回答

9

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

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

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

代替

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

这将取决于您的编译选项,并且更具体地取决于您的包含路径。

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

+3

在最后一种情况下,它不会“要求你指定”任何东西。它是“首先找到的”(通常意味着包含目录列表中列出的第一个)。 –

4

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

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

通常,您应该具有特定的描述性名称以防止争用。以与使用C++名称空间相同的方式使用目录是一种足够体面的练习。看看像libxml ++和gtkmm这样的库的结构。

1

编译器股包括,该目录包括被列为参数-I顺序文件。使用找到的第一个文件。

如果有两个文件名称相同,则应指定源文件中您想要的文件。