インクルード ガードはヘッダー ファイルを相互の再帰的包含から保護します。 >
相互包含におけるデータ構造の定義間に依存関係がある場合に問題が発生します。ヘッダー。例:// a.h #include "b.h" struct A { ... }; // b.h #include "a.h" struct B { A* pA; // error: class A is forward-declared but not defined };これを解決するには、インクルード ガードの代わりに前方宣言を使用する必要があります:
// b.h #include "a.h" // Forward declaration of A struct A; struct B { A* pA; };なぜインクルード ガードで複数の定義が防止されないのですか?インクルード ガードは、同じ翻訳単位内の冗長なインクルードからヘッダーを保護します。ただし、異なる翻訳単位に存在するため、複数の定義が発生する可能性があります。
これを解決するには、inline キーワードを使用して、異なる翻訳単位で複数の定義を許可できます。
あるいは、関数定義を別のソース ファイルに移動して、複数の定義を避けることもできます:
// header.h inline int f() { ... }
以上がインクルード ガードが相互再帰と複数の定義を防止できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。