C ++ Header Guard问题

时间:2010-05-19 14:41:21

标签: c++ include header include-guards

我正在制作一个小的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,它工作正常..

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

谢谢:)

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

也可以使用包含警卫来保护主标题:

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

这将阻止递归包含。

答案 2 :(得分:2)

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

取而代之的是:

1)在相关的子标题文件中定义所需的所有内容。

2)仅在CPP文件中包含所需的子头文件。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我猜你之间存在依赖关系 - 比如B和C,B取决于C,但是在frame.h中,C包含在B之后。

答案 5 :(得分:0)

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

您应该在A.h中加入B.hC.hframework.h,在A.h中加入framework.h,只需转发声明你从中使用的类。或者反过来做:从framework.hA.hB.h加入C.h,在framework.h中转发声明类。当然,将每个需要比class A更详细的声明的代码放到.cpp文件中。