インクルード ガードは確かにヘッダー ファイルを保護します相互、再帰的な包含から。混乱が生じるのは、問題はガードではなく、ヘッダー ファイルでのデータ構造の定義方法にあるためです。
次の例を考えてみましょう。
// a.h #ifndef A_H #define A_H #include "b.h" struct A { ... }; #endif // A_H // b.h #ifndef B_H #define B_H #include "a.h" struct B { A* pA; }; #endif // B_H // main.cpp #include "a.h" int main() { ... }
インクルード ガードがある場合でも、main。クラス A (クラス B に必要) の定義が不完全であるため、cpp はコンパイルに失敗します。前方宣言により、この問題が解決されます。
// b.h #ifndef B_H #define B_H // Forward declare A to avoid circular inclusion struct A; struct B { A* pA; }; #endif // B_H
インクルード ガードは、単一の翻訳単位内の複数の定義から保護しますが、異なる単位間では保護しません。説明すると、
// header.h #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H // source1.cpp #include "header.h" // Redundant include causing multiple definitions #include "header.h" int main() { ... } // source2.cpp #include "header.h" ...
インクルード ガードを使用しても、リンカは f() の複数の定義についてエラーを出します。解決策は、関数を 1 つの翻訳単位のみで定義するか、 inline キーワードを使用して各呼び出しサイトで関数本体をインライン化するようにコンパイラーに指示することです。
以上がインクルード ガードは相互再帰と複数のシンボル定義をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。