インクルード ガードは再帰的インクルージョンに対する保護を提供しますが、相互インクルードヘッダー内のデータ構造定義間の依存関係を防ぐことはできません。次のコードを考えてみましょう:
// header.h #ifndef HEADER_H #define HEADER_H class A; class B { public: A* pA; }; #endif // HEADER_H
// source1.cpp #include "header.h" A* aPtr = new A;
// source2.cpp #include "header.h" B* bPtr = new B;
このシナリオでは、source1.cpp には header.h が含まれており、これには (間接的に) source2.cpp が含まれます。この動作はインクルード ガードによって防止されますが、クラス A が header.h で定義されていないため、コンパイラは依然としてエラーを報告します。
この問題を解決するには、header.h:
// header.h #ifndef HEADER_H #define HEADER_H struct A; class B { public: A* pA; }; #endif // HEADER_H
// header.h #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H
// source1.cpp #include "header.h" int main() { f(); }
// source2.cpp #include "header.h" int main() { f(); }
// header.h #ifndef HEADER_H #define HEADER_H inline int f() { return 0; } #endif // HEADER_H
以上がインクルード ガードが再帰的インクルージョンと複数のシンボル定義を防止できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。