なぜインクルードしないのですか?ヘッダファイルを相互再帰から保護するガードinclusion?
インクルードガードは仕事をしています。この問題は、相互にインクルードするヘッダー内のデータ構造の定義間の依存関係から発生します。
たとえば、a.h と b.h に次の内容が含まれているとします。
// a.h #ifndef A_H #define A_H #include "b.h" struct A {...}; #endif // b.h #ifndef B_H #define B_H #include "a.h" struct B {...}; #endif
インクルード ガードがないと、main.cpp は次のように動作しません。コンパイルの深さの制限によりコンパイルされます。
インクルード ガードを使用すると、無限再帰が防止されます。ただし、定義間の依存関係は残ります。
これを解決するには、必要なヘッダーで前方宣言を使用します。
// b.h #ifndef B_H #define B_H struct A; // Forward declaration struct B {...}; #endif
なぜインクルードされないのか複数の定義を防ぐガード?
ガードを含めると再定義を防ぐことができます
たとえば、header.h:
#ifndef HEADER_H #define HEADER_H int f() {...}; #endif
が複数の翻訳単位 (source1.cpp やsource2.cpp など) に含まれる場合:
// source1.cpp #include "header.h" // source2.cpp #include "header.h"
リンカは、別のオブジェクトで同じ定義を認識するため、f() の複数の定義について文句を言います。
これを解決するには、次の方法を使用します。
以上がインクルード ガードが再帰的インクルードと複数のシンボル定義を防止できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。