假设我们有两个头文件:/directory1/A.hpp
和directory2/A.hpp
. 这两个标题的内容不同!
我们的构建目标A.cpp
需要directory1
和directory2
包含路径,因为在两个目录中还有其他需要的头文件。
现在,A.cpp
里面有一个#include "A.hpp"
声明。
预处理器会选择哪个版本A.hpp
?
如果一个人使用 3rd 方软件,那么这种情况是否可能会发生?
假设我们有两个头文件:/directory1/A.hpp
和directory2/A.hpp
. 这两个标题的内容不同!
我们的构建目标A.cpp
需要directory1
和directory2
包含路径,因为在两个目录中还有其他需要的头文件。
现在,A.cpp
里面有一个#include "A.hpp"
声明。
预处理器会选择哪个版本A.hpp
?
如果一个人使用 3rd 方软件,那么这种情况是否可能会发生?
在这种情况下会发生什么取决于所讨论的编译器(请参阅您使用的编译器的文档)。
像这样的情况是使用“不合格”标题名称通常是一个坏主意的原因。始终构建包含目录以将路径的一部分保留为名称的必要组成部分。例如
#include <boost/preprocessor.hpp>
#include <gl/GL.h>
代替
#include <preprocessor.hpp>
#include <GL.h>
带有双引号的 include 指令以文字形式粘贴引用的文件。文件路径被认为是相对于源文件位置的。
因此,如果您有#include "directory1/A.hpp"
,它将包括显而易见的。如果您#include <A.hpp>
或#include "A.hpp"
,则取决于哪个首先出现在您的搜索路径中。
通常,您应该有具体的描述性名称,以防止此处出现争用。以与使用 C++ 命名空间相同的方式使用目录是一种不错的做法。查看 libxml++ 和 gtkmm 等库的结构。
这将取决于您的编译选项,尤其是您的包含路径。
如果 directory1 在包含路径中,它将是/directory1/A.hpp
,否则如果 directory2 在包含路径中,它将是/directory2/A.hpp
. 如果 directory1 和 directory2 都在包含路径中,编译器会要求您指定目录,例如#include "directory1/A.hpp"
.
编译器按照包含目录作为参数列出的顺序选择包含文件-I
。使用找到的第一个文件。
在有两个同名文件的情况下,您应该在源文件中指定您想要的文件。