C++ Header File Include Patterns

http://www.eventhelix.com/realtimemantra/headerfileincludepatterns.htm

C++ Header File Include Patterns

Complex software in Realtime systems requires a careful header file management even when programming in C. When developers move to C++, header file management becomes even more complex and time consuming. Here we present a few header file inclusion patterns that will simplify this chore.

Header File Inclusion Rules

Here, we discuss the basic rules of C++ header file inclusion needed to simplify header file management.

  • A header file should be included only when a forward declaration would not do the job.
  • The header file should be so designed that the order of header file inclusion is not important.
  • The header file inclusion mechanism should be tolerant to duplicate header file inclusions.

The following sections will explain these rules with the help of an example.

Header File Inclusion Example

The following example illustrates different types of dependencies. Assume a class A with code stored in a.cpp and a.h.

a.h

 
  1. #ifndef _a_h_included_
  2. #define _a_h_included_
  3. #include "abase.h"
  4. #include "b.h"

  5. // Forward Declarations
  6. class C;
  7. class D;

  8. class A : public ABase
  9. {
  10.   B m_b;
  11.   C *m_c;
  12.   D *m_d;
  13.  
  14. public:
  15.   void SetC(C *c);
  16.   C *GetC() const;
  17.  
  18.   void ModifyD(D *d);
  19. };
  20. #endif

a.cpp

 
  1. #include "a.h"
  2. #include "d.h"

  3. void A::SetC(C* c)
  4. {
  5.   m_c = c;
  6. }

  7. C* A::GetC() const
  8. {
  9.   return m_c;
  10. }

  11. void A::ModifyD(D* d)
  12. {
  13.   d->SetX(0);
  14.   d->SetY(0);
  15.   m_d = d;
  16. }

File Inclusion Analysis

Lets analyze the header file inclusions, from the point of view of classes involved in this example, i.e. ABase, A, B, C and D.

Class ABaseABase is the base class, so the class declaration is required to complete the class declaration. The compiler needs to know the size of ABase to determine the total size of A. In this case abase.h should be included explicitly in a.h.
Class BClass A contains Class B by value , so the class declaration is required to complete the class declaration. The compiler needs to know the size of B to determine the total size of A. In this case b.h should be included explicitly in a.h.
Class CClass C is included only as a pointer reference. The size or actual content of C are not important to a.h or a.cpp. Thus only a forward declaration has been included in a.h. Notice that c.h has not been included in either a.h or a.cpp.
Class DClass D is just used as a pointer reference in a.h. Thus a forward declaration is sufficient. But a.cpp uses class D in substance so it explicitly includes d.h.

Key Points

The key points here are header files should be included only when a forward declaration will not do the job. By not including c.h and d.h other clients of class A never have to worry about c.h and d.h unless they use class C and D in substance.

Also note that a.h has been included as the first header file in a.cpp This will make sure that a.h does not expect a certain header files to be included before a.h. As a.h has been included as the first file, successful compilation of a.cpp will ensure that a.h does not expect any other header file to be includedbefore a.h. If this is followed for all classes, (i.e. x.cpp always includes x.h as the first header) there will be no dependency on header file inclusion.

Note that a.h includes the check on preprocessor definition of symbol _a_h_included_. This makes it tolerant to duplicate inclusions of a.h.

Cyclic Dependency

Cyclic dependency exists between class X and Y in the following example. This dependency is handled by using forward declarations.

x.h and y.h

 
  1. /* ====== x.h ====== */
  2. // Forward declaration of Y for cyclic dependency
  3. class Y;

  4. class X
  5. {
  6.     Y *m_y;
  7.     ...
  8. };

  9. /* ====== y.h ====== */
  10. // Forward declaration of X for cyclic dependency
  11. class X;

  12. class Y
  13. {
  14.     X *m_x;
  15.     ...
  16. };

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值