循环 #include 的标头防护问题
我正在制作一个小型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 因此我不需要每次都包含所有依赖项。
谢谢 :)
I am making a small C++ framework, which contains many .h and .cpp.
I have created a general include which include all my .h file such as:
framework.h
#include "A.h"
#include "B.h"
#include "C.h"
each .h header are protected with include guard such as
#ifndef A_HEADER
#define A_HEADER
...
#endif
The issues is, I would like to be able to include "framework.h" inside all the sub .h such as, but it cause lots of compiler error:
#ifndef A_HEADER
#define A_HEADER
#include "framework.h"
...
#endif
If instead I use the real header file for each sub header, and the framework.h for what ever use my framework it works fine..
I would just like to include the main header inside all my sub .h so I dont need to include all the dependency everytime.
Thanks :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(6)
我建议使用 #pragma Once ,并将其放在所有头文件的顶部(framework.h、Ah、Bh 和 Ch)。
不过,如果您愿意,我认为您也可以通过简单地在 Framework.h 中添加包含保护来解决您的问题。
在 C++ 中,循环包含通常是一个坏主意。虽然使用标头保护可以防止预处理器进入无限循环(或因此引发错误),但您会遇到意外的编译器错误,因为在某些时候,如果您认为包含头文件,则不会包含头文件。
您应该包含来自 framework.h
的 Ah
、Bh
和 Ch
以及 Ah
>,不要包含framework.h
,只需向前声明您从中使用的类即可。或者反过来做:包含来自 Ah
、Bh
和 Ch
的 framework.h
,并转发声明framework.h
中的类。当然,将需要比例如 class A
更详细声明的所有代码放入 .cpp 文件中。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
基本上你所做的就是在framework.h中
#include "Ah"
和在Ah中#include "framework.h"
这会导致头文件的循环依赖,你会得到诸如未定义的类A之类的错误。要解决此问题,请在头文件中使用前向声明,并仅在相应的cpp文件中使用#include
。如果这是不可能的,那么除了包含单独的头文件之外,我看不到任何其他选项。Basically what your doing is
#include "A.h"
in framework.h and#include "framework.h"
in A.h. This causes cyclic dependency of the header files and you will get errors such as undefined class A. To solve this, use forward declarations in header file and#include
only in corresponding cpp file. If that is not possible then I don't see any other option other than including individual header files.