【问题标题】:C++ Header Guard issuesC++ Header Guard 问题
【发布时间】:2011-02-21 10:22:37
【问题描述】:

我正在制作一个小型 C++ 框架,其中包含许多 .h 和 .cpp。

我创建了一个通用包含,其中包含我所有的 .h 文件,例如:

framework.h

#include "A.h"
#include "B.h"
#include "C.h"

每个 .h 标头都受包含保护,例如

#ifndef A_HEADER
#define A_HEADER
...
#endif

问题是,我希望能够在所有子 .h 中包含“framework.h”,但它会导致很多编译器错误:

#ifndef A_HEADER
#define A_HEADER

#include "framework.h"
...
#endif

如果我为每个子标题使用真正的头文件,而使用我的框架的 framework.h 则可以正常工作..

我只想在我的所有子 .h 中包含主标题,所以我不需要每次都包含所有依赖项。

谢谢:)

【问题讨论】:

  • 您遇到什么错误?如果文件正确,它应该可以工作
  • 也许您忘记了 framework.h 中包含的引号?
  • 没有循环依赖问题,但是取消定义的东西,就像我忘记包含一个 .h 一样。大多数东西都是在一些头文件中内联定义的。

标签: c++ include header include-guards


【解决方案1】:

基本上你所做的是在 framework.h 中的 #include "A.h" 和在 A.h 中的 #include "framework.h"。这会导致头文件的循环依赖,并且会出现未定义类A等错误。要解决此问题,请在头文件中使用前向声明,并仅在相应的cpp文件中使用#include。如果那不可能,那么除了包含单个头文件之外,我看不到任何其他选项。

【讨论】:

    【解决方案2】:

    只需使用包含保护来保护主标题:

    #ifndef FRAMEWORK_H
    #   define FRAMEWORK_H
    #   include <A.h>
    #   include <B.h>
    #   include <C.h>
    #endif
    

    这将防止递归包含。

    【讨论】:

    • 没有循环依赖问题,但是取消定义的东西,就像我忘记包含一个 .h 一样。大多数东西都是在一些头文件中内联定义的。
    【解决方案3】:

    您不应该在子头文件中包含主头文件。它应该用来让用户的生活更轻松,而不是你的。

    改为执行以下操作:

    1) 在相关的子头文件中定义所有你需要的东西。

    2) 在 CPP 文件中只包含需要的子头文件。

    3) 在应用程序代码中使用您的框架时(例如),您可以包含主框架头文件。

    【讨论】:

      【解决方案4】:

      我建议使用#pragma once,并将其放在所有头文件(framework.h、A.h、B.h 和 C.h)的顶部。

      不过,如果您愿意,我认为您也可以通过在 framework.h 中添加一个包含保护来解决您的问题。

      【讨论】:

      • 请不要在框架中使用#pragma,我们普通人讨厌那些来自 g++ 的弃用警告。
      • 不再是问题。来自 Wikipedia:“但是,随着 GCC 的 3.4 版本,#pragma once 处理代码被修复为使用符号和硬链接正确运行。该功能被“不推荐使用”并删除了警告“
      【解决方案5】:

      我猜你在 B 和 C 之间存在依赖关系,因此 B 依赖于 C,但在 framework.h 中,C 包含在 B 之后。

      【讨论】:

        【解决方案6】:

        循环包含在 C++ 中通常是一个坏主意。虽然拥有头文件保护可以防止预处理器进入无限循环(或因此而引发错误),但您会得到意想不到的编译器错误,因为在某些时候,如果您认为头文件不会包含在其中。

        您应该在framework.h 中包含A.hB.hC.h,并且在A.h 中,不要包含framework.h,只需转发声明您从中使用的类。或者反过来做:包括A.hB.hC.h中的framework.h,并在framework.h中转发声明类。当然,将需要比class A 更详细的声明的所有代码都放入 .cpp 文件中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          相关资源
          最近更新 更多