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:
// A.h
#ifndef A_H_
#define A_H_
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// 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_
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:
// 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_
// 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_
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:
// 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_
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3