6

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

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

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

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

如果一个人使用 3rd 方软件,那么这种情况是否可能会发生?

4

4 回答 4

10

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

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

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

代替

#include <preprocessor.hpp>
#include <GL.h>
于 2013-05-30T09:34:06.753 回答
5

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

因此,如果您有#include "directory1/A.hpp",它将包括显而易见的。如果您#include <A.hpp>#include "A.hpp",则取决于哪个首先出现在您的搜索路径中。

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

于 2013-05-30T09:33:50.410 回答
3

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

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

于 2013-05-30T09:32:34.070 回答
1

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

在有两个同名文件的情况下,您应该在源文件中指定您想要的文件。

于 2013-05-30T09:35:26.337 回答