2

我正在制作一个小型 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 中包含主标题,所以我不需要每次都包含所有依赖项。

谢谢 :)

4

6 回答 6

7

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

于 2010-05-19T14:51:54.307 回答
2

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

而是执行以下操作:

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

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

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

于 2010-05-19T15:20:59.337 回答
2

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

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

这将防止递归包含。

于 2010-05-19T14:46:43.663 回答
0

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

于 2010-05-19T14:55:00.493 回答
0

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

您应该包含A.h,B.hC.hfrom framework.h, and in A.h, 不要包含framework.h, 只需向前声明您从中使用的类。或者反过来做:包括framework.hfrom A.h, B.hand C.h, 并转发声明类 in framework.h。而且,当然,将需要比例如class A.cpp 文件更详细的声明的所有代码都放入其中。

于 2010-05-19T14:59:02.170 回答
0

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

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

于 2010-05-19T14:45:26.670 回答