C にガードと循環依存関係を含める
問題は、コード内の循環 #include 依存関係から発生します。セットアップでは、Physics.h には GameObject.h が含まれており、GameObject.h には Physics クラスにアクセスするために Physics.h が含まれている必要があります。
プリプロセッサによる #include の処理方法
プリプロセッサは、インクルードされたファイルの内容を現在のファイルに物理的にコピーすることによって #include ステートメントを処理します。あなたの場合:
インクルード ガードが失敗する理由
インクルード ガードは、循環依存関係の防止には効果的ではありません。次のコードを考えてみましょう:
// Physics.h #ifndef PHYSICS_H #define PHYSICS_H #include "GameObject.h" #endif
プリプロセッサがこのコードを処理すると、GameObject.h が Physics.h にコピーされます。ただし、プリプロセッサは循環参照を認識せず、GameObject のコピーされたコンテンツ内の #include 行を実行し、Physics.h (すでにインクルードされている) をインクルードしようとします。これにより、コンパイル時エラーが発生します。
循環依存関係の解決
循環依存関係を解決するには、前方宣言を使用できます。あなたの場合:
Physics.h
class Physics; // Forward declaration class GameObject { // ... Physics* physics; // Pointer to Physics object // ... };
GameObject.h
#include "Physics.h" class GameObject { // ... Physics physics; // Actual object declaration // ... };
フォワードを使用することによりPhysics.h で宣言し、GameObject.h で実際のオブジェクトを宣言すると、コンパイラは、これらのクラスの定義。最初に Physics.h で前方宣言を処理し、次に GameObject.h で実際のオブジェクト定義を処理することで、循環性の問題を回避できます。
以上がインクルード ガードが C の循環依存関係を防止できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。