C 中相互包含的头文件
C 头文件可以相互包含,但必须遵循某些准则以避免编译错误。
包含语句放置
转发声明
考虑以下代码,其中两个类 A 和 B 相互包含:
<code class="cpp">// A.h #ifndef A_H_ #define A_H_ #include "B.h" class A { public: A() : b(*this) {} private: B b; }; #endif</code>
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ #include "A.h" class B { public: B(A& a) : a(a) {} private: A& a; }; #endif</code>
在这种情况下,编译器首先遇到类 B,但 A 尚未声明。要解决此问题,应在 B 的定义之前包含 A 的前向声明:
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ class A; // Forward declaration of class A #include "A.h" class B { public: B(A& a) : a(a) {} private: A& a; }; #endif</code>
此前向声明通知编译器 A 是一个类,即使其完整定义尚不可用。
实践中
一般来说,#include 语句应该放在 include 守卫内,当 header 需要引用时应该使用前向声明到稍后包含的标头中定义的类。通过遵循这些准则,您可以避免由循环包含引起的编译错误。
以上是在 C 中如何避免循环头包含?的详细内容。更多信息请关注PHP中文网其他相关文章!