【问题标题】:Equal header file in different include paths不同包含路径中的相同头文件
【发布时间】:2013-05-25 19:20:07
【问题描述】:

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

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

现在,A.cpp 中有一个 #include "A.hpp" 语句。

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

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

【问题讨论】:

  • 我认为编译器只是将#include这一行替换为文件的内容,所以名称无关紧要。
  • 如果你使用#pragma once或者包含保护,没关系,因为内容只插入一次。
  • 对不起,忘了说如果两个头文件不同会发生什么,见编辑。
  • 命名空间,命名空间,命名空间,无处不在。文件名也是名称,因此它们需要命名空间。拍摄两位图书馆作者。

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


【解决方案1】:

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

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

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

而不是

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

【讨论】:

    【解决方案2】:

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

    所以如果你有#include "directory1/A.hpp",它将包括显而易见的那个。如果您是#include &lt;A.hpp&gt;#include "A.hpp",则取决于哪个出现在您的搜索路径中。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 在最后一种情况下它不会“要求您指定”任何内容。它是“第一次找到”(通常表示包含目录列表中列出的第一个)。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-10-05
        • 2020-02-16
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 2021-07-11
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        相关资源
        最近更新 更多