2010-05-19 85 views
2

我正在制作一个小型C++框架,其中包含许多.h和.cpp文件。C++头文件保护问题

我创建了一个一般包括包括我所有的.h文件中,如:

framework.h 

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

每个.H头与保护包括后卫如

#ifndef A_HEADER 
#define A_HEADER 
... 
#endif 

的一个问题是,我希望能够在所有sub.h中包含“framework.h”,但会导致大量编译器错误:

#ifndef A_HEADER 
#define A_HEADER 

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

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

我只想包括所有我的sub .h所以主头我不需要每次都包含所有的依赖项。

谢谢:)

+1

你得到的错误是什么?它应该工作,如果文件是正确的 – Mark 2010-05-19 14:44:22

+0

也许你忘记在framework.h包括引号? – 2010-05-19 14:48:21

+0

没有循环依赖的问题,但没有定义的东西,就像它,如果我忘了包括一个.h。 Mosty的东西是在一些头文件中内联定义的。 – 2010-05-19 14:49:00

回答

7

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

0

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

虽然,如果你愿意,我认为你可以通过在framework.h中加入一个include guard来解决你的问题。

+0

请不要在框架中使用#pragma,我们普通的人会讨厌g ++的那些弃用警告。 – avakar 2010-05-19 14:48:22

+2

不再是问题。 “然而,随着3.4版GCC的发布,#pragma一次处理代码被修复为在符号链接和硬链接上正常运行。该功能被”取消弃用“,并且警告消除了” – 2010-05-19 14:51:50

+0

“我立即纠正了。 – avakar 2010-05-19 17:41:56

2

只是保护的主头与包括警卫太:

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

这将防止递归的包容性。

+0

没有循环依赖的问题,但没有定义的东西,就像它,如果我忘了包含.h。 Mosty的东西是在一些头文件中内联定义的。 – 2010-05-19 14:50:45

0

我猜你有一个依赖之间 - 说B和C,使得B依赖于C,但在framework.h C被列入后B.

+0

你是对的,但纳文首先回答了 – 2010-05-19 14:57:10

0

通知包括一般都在C坏主意++。虽然有标题保护会阻止预处理器进入无限循环(或因此引发错误),但您会收到意外的编译器错误,因为在某些情况下,如果您认为它是包含的,则不会包含头文件。

你应该包括A.h,从framework.hB.hC.h,并在A.h,不包括framework.h,只是向前声明你从它使用的类。或者以相反方式进行:包括来自A.h,B.hC.hframework.h,以及framework.h中的前向声明类。当然,将每个需要更多详细声明的代码放在.cpp文件中,例如class A

2

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

而是做以下操作:

1)请转发所有你在相关的子头文件需要的定义。

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

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

+0

+1 – neuro 2010-05-19 16:03:17