在 C 中包含守衛和循環依賴項
您的問題是由程式碼中的循環 #include 依賴項引起的。在您的設定中,Physics.h 包含 GameObject.h,而 GameObject.h 需要包含Physics.h 才能存取Physics 類別。
預處理器如何處理 #include
預處理器透過將包含檔案的內容物理複製到目前檔案來處理#include語句。在您的情況下:
為什麼 Include Guards 失敗
包含 Guards 不能有效防止循環依賴。考慮以下程式碼:
// 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中的實際物件定義,避免任何循環問題。
以上是Include Guard 如何無法防止 C 中的循環依賴?的詳細內容。更多資訊請關注PHP中文網其他相關文章!