2010-10-10 60 views
3

我使用#pragma一次,而不是#include所有我的h文件的守衛。如果a.h需要#include b.h和b.h需要#include a.h,我該怎麼辦?正確的方式#include當有循環依賴?

我得到了各種錯誤,如果因爲這樣做,編譯一旦生效,其中之一是缺少對方。我應該如何做到這一點。

感謝

+0

許多重複:http:// stackoverflow。com/questions/1748624/circular-dependencies-of-declarations,以及http://stackoverflow.com/questions/1655096/c-class-its-base-class-and-circular-include-includes僅舉幾例 – 2010-10-10 19:41:28

回答

4

您需要轉發聲明您需要的定義。所以如果A使用B作爲參數值,則需要轉發declare B,反之亦然。

這可能是因爲剛向前聲明的類名稱:

class A; 
class B; 

解決您的問題。

接受的答案this question提供了一些額外的指導。

2

一種可能性是重構文件a.hb.h的某些部分進入第三個文件說c.h,並將其包括來自a.hb.h。這樣,後兩者不再需要相互包含。

另一種可能性是將單獨的頭文件合併爲一個。

第三種可能性是這種情況,當兩個類合法需要參考彼此。在這種情況下你必須使用指針。而且,您可以轉發聲明類而不是包含其頭文件。 [還提到jdv例如,

// file a.h 
struct B; 
struct A { B * b_ }; 

// file b.h 
struct A; 
struct B { A * a_; }; 

但是,不知道你的具體情況,很難提供具體建議。

0

這取決於彼此的頭文件需要什麼。如果它是一個類的定義,但它僅是使用指針類,那麼替代的,包括只把一個向前聲明象頭文件:

class MyClassA;

0

此問題的解決方案是「向前聲明」。

如果你有一個類或需要在2頭中的頭一個需要轉發聲明中使用的類或類型要使用的功能。 或者您需要考慮重構您的標題。

這是一個常見的問題初學者是循環依賴是造成這些問題。如果你的谷歌'前向宣言'會發現噸的結果。

因爲你的問題是太不具體,我不能給你一個確切的答案,對不起這一點。

0

你不能使用不完整的類型,但你可以直接聲明它們。你只需告訴編譯器:「不要得到語法錯誤,我知道我在做什麼」。這意味着鏈接器將會從庫中找到完整的類型。