假设我们有两个标头文件:/directory1/A.hpp
和directory2/A.hpp
。这两个标题的内容是不同!
我们的构建目标A.cpp
需要directory1
和directory2
作为包含路径,因为两个目录中还有其他所需的头文件。
现在,在A.cpp
中有一个#include "A.hpp"
声明。
预处理器选择哪个版本的A.hpp
?
如果一个人使用第三方软件,那么这种情况可能会发生吗?
答案 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
的参数的顺序选择包含文件。使用找到的第一个文件。
如果有两个具有相同名称的文件,则应在源文件中指定所需的文件。