C 中相互包含的頭檔
C 頭檔可以互相包含,但必須遵循某些準則以避免編譯錯誤。
包含語句放置
轉發聲明
考慮以下程式碼,其中兩個類別A 和B 相互包含:
<code class="cpp">// A.h #ifndef A_H_ #define A_H_ #include "B.h" class A { public: A() : b(*this) {} private: B b; }; #endif</code>
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ #include "A.h" class B { public: B(A& a) : a(a) {} private: A& a; }; #endif</code>
在這種情況下,編譯器首先遇到類別B,但A 尚未聲明。要解決此問題,應在B 的定義之前包含A 的前向聲明:
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ class A; // Forward declaration of class A #include "A.h" class B { public: B(A& a) : a(a) {} private: A& a; }; #endif</code>
先前向聲明通知編譯器A 是一個類,即使其完整定義尚不可用。
實務上
一般來說,#include 語句應該放在include 守衛內,當header 需要引用時應該使用前向聲明到稍後包含的標頭中定義的類別。遵循這些準則,您可以避免由迴圈包含引起的編譯錯誤。
以上是在 C 中如何避免循環頭包含?的詳細內容。更多資訊請關注PHP中文網其他相關文章!