Home >Backend Development >C++ >How to Handle Circular Dependencies Between Headers in C ?
Headers Including Each Other in C
In C , it is occasionally necessary for headers to include each other. However, this can lead to issues, especially when it comes to where to place the #include statements.
Inside or Outside Macros
In general, #include statements should be placed inside macros, such as #ifndef include guards. This prevents infinite recursion during compilation, as demonstrated in the following example:
<code class="cpp">// A.h #ifndef A_H_ #define A_H_ #include "B.h" class A { private: B b; public: A() : b(*this) {} }; #endif // A_H_</code>
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ #include "A.h" class B { private: A& a; public: B(A& a) : a(a) {} }; #endif // B_H_</code>
Placing the #include statements outside the macros results in the compiler recursing indefinitely due to the mutual inclusion between A.h and B.h.
Undeclared Types
However, placing the #include statements inside the macros can lead to issues with undeclared types. For example, consider the following code:
<code class="cpp">// A.h #ifndef A_H_ #define A_H_ class A; // Forward declaration #include "B.h" class A { private: B b; public: A() : b(*this) {} }; #endif // A_H_</code>
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ #include "A.h" class B { private: A a; // Directly include A public: B(A& a) : a(a) {} }; #endif // B_H_</code>
In this case, the compiler will complain that A is an undeclared type within B.h. This is because the forward declaration in A.h is not visible when B.h is included.
Solution: Forward Declarations
To resolve these issues, it is best to use forward declarations and include the header containing the full definition where necessary. In this example, a forward declaration of A should be added to B.h before the definition of B:
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ class A; // Forward declaration #include "A.h" class B { private: A a; // Directly include A public: B(A& a) : a(a) {} }; #endif // B_H_</code>
The above is the detailed content of How to Handle Circular Dependencies Between Headers in C ?. For more information, please follow other related articles on the PHP Chinese website!