C で相互にインクルードされるヘッダー
C では、ヘッダーが相互にインクルードする必要がある場合があります。ただし、特に #include ステートメントを配置する場所に関して問題が発生する可能性があります。
マクロの内部または外部
一般に、#include ステートメントは次のようにする必要があります。 #ifndef include ガードなどのマクロ内に配置できます。これにより、次の例に示すように、コンパイル中の無限再帰が防止されます。
<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>
マクロの外側に #include ステートメントを配置すると、A.h と B.h の相互包含によりコンパイラが無限に再帰的に実行されます。
未宣言型
ただし、#include ステートメントをマクロ内に配置すると、未宣言型に関する問題が発生する可能性があります。たとえば、次のコードを考えてみます。
<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>
この場合、コンパイラは、A が B.h 内で宣言されていない型であると警告します。これは、B.h が含まれる場合、A.h の前方宣言が表示されないためです。
解決策: 前方宣言
これらの問題を解決するには、前方宣言を使用するのが最善です。必要に応じて、完全な定義を含むヘッダーを含めます。この例では、A の前方宣言を 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>の定義の前に B.h に追加する必要があります。
以上がC でヘッダー間の循環依存関係を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。