我試圖向前聲明一個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
};
我在做什麼錯?
我試圖向前聲明一個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
};
我在做什麼錯?
這樣的工作,你可以左右一個聲明指向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,但只需知道如何分配一個指針。
「不完整類型」(MSDN)是一種類型,其編譯器在翻譯單元的給定點處不知道的細節。在struct B
的成員聲明中,編譯器不知道類型的大小(sizeof (struct A)
),因此不知道要爲它留出多少空間。不允許struct
成員的不完整類型的另一個原因是,如果他們可以,這將允許「圓形成分」,其中struct A
包含struct B
類型的成員,反之亦然。我不明白這樣一個循環組合的結果的大小甚至可以被定義。
解決方法:
struct B
包括struct A
由值,首先完成的類型。將struct A
的成員聲明移至struct B
以上。struct
被允許包含指向不完整類型的指針作爲成員。在struct B
中包含一個指針數組(struct A *x[10];
)然後用單獨分配的struct A
類型的對象填充它,可能通過調用malloc(sizeof(struct A))
的某個工廠填充其成員並返回指針。然後,您負責釋放這些實例使用的內存。