C で相互にインクルードされるヘッダー
C ヘッダー ファイルは相互にインクルードできますが、コンパイル エラーを避けるために特定のガイドラインに従う必要があります。
Include ステートメントの配置
前方宣言
2 つのクラス 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 ステートメントはインクルード ガードの内側に配置する必要があり、ヘッダーが参照する必要がある場合は前方宣言を使用する必要があります。後でインクルードされるヘッダーで定義されるクラスに追加します。これらのガイドラインに従うことで、循環インクルードによって発生するコンパイル エラーを回避できます。
以上がC で循環ヘッダーの組み込みを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。