2015-02-07 90 views
0

我試圖向前聲明一個struct A和定義包含「不準不完全型」陣列前進的另一個結構

這是A. 我得到錯誤,指出數組的結構乙聲明結構我有什麼:

struct A; 

struct B 
{ 
// something 
struct A x[10]; // This where I get the error incomplete type not allowed 
}; 

struct A 
{ 
// something 
}; 

我在做什麼錯?

回答

2

這樣的工作,你可以左右一個聲明指向struct A作爲該

struct B 
{ 
// something 
struct A * x; 
}; 

這是因爲如果你有一個像

struct B b; 

線的b將有一個成員x[10]。如果你沒有完全聲明struct A,那麼struct B不知道如何分配10個struct A元素。在變通方法中,如果只聲明一個指針,則struct B不需要知道如何分配struct A,但只需知道如何分配一個指針。

1

「不完整類型」(MSDN)是一種類型,其編譯器在翻譯單元的給定點處不知道的細節。在struct B的成員聲明中,編譯器不知道類型的大小(sizeof (struct A)),因此不知道要爲它留出多少空間。不允許struct成員的不完整類型的另一個原因是,如果他們可以,這將允許「圓形成分」,其中struct A包含struct B類型的成員,反之亦然。我不明白這樣一個循環組合的結果的大小甚至可以被定義。

解決方法:

  • struct B包括struct A由值,首先完成的類型。將struct A的成員聲明移至struct B以上。
  • A struct被允許包含指向不完整類型的指針作爲成員。在struct B中包含一個指針數組(struct A *x[10];)然後用單獨分配的struct A類型的對象填充它,可能通過調用malloc(sizeof(struct A))的某個工廠填充其成員並返回指針。然後,您負責釋放這些實例使用的內存。