2011-05-09 96 views
1

我最近剛換了從Java編程的C/C++編程所以請原諒我,如果這是一個愚蠢的問題:結構的C/C++

我有它由一個結構,其中包括2的頭文件來自不同位置的另一個頭文件的結構。它看起來是這樣的:

struct A { 
    struct B variable1; 
    struct C *variable2; 
    ... more variable declarations here. 
}; 

其中包含結構B和結構C中聲明的頭文件不包含在這個特定的頭文件,但即便我做了包括他們並沒有區別 - 在這兩種情況下編譯時我得到

error: field 'variable1' has incomplete type 

我只是想知道如果有人知道這可能是從什麼? 謝謝!

+2

請顯示'struct B'的定義代碼... – 2011-05-09 15:43:00

+0

確保'struct B'或'struct C'聲明中沒有包含任何宏,這使得它們在'struct A中不可見'。 – yasouser 2011-05-09 15:47:44

+0

你確定你在struct A之前聲明瞭struct B和struct C嗎? – ascanio 2011-05-09 15:49:00

回答

4

如果您不包括struct B的定義,您應該會看到提到的錯誤,因爲結構的大小尚未知。的struct C的類型,你只能有一個指針可能只是預先宣佈:

struct C; 

如果您有與struct B定義的文件,你不應該得到的錯誤,所以如果你仍然這樣做指向你的代碼中的其他錯誤。

-3

嘗試向前聲明:

struct B; 
struct C; 
struct A { 
    struct B variable1; 
    struct C *variable2; 
    ... more variable declarations here. 
}; 
+3

-1:此處的'struct B'的前向聲明是不夠的。 – 2011-05-09 15:46:50

1

也可能是結構定義的順序? 工作

struct b { 
    int y; 
}; 

struct a { 
    int x; 
    struct b c; 
}; 

同樣的錯誤你:結構,B就不需要結構A.

我的測試是之前定義,並準備

struct a { 
    int x; 
    struct b c; 
}; 

struct b { 
    int y; 
}; 
0

結構一個在這裏被定義,它必須有一個已知的大小。編譯器必須知道什麼是結構乙的大小來計算的規模結構體的成員,所以如果結構乙還沒有定義,你將無法在使用它結構一個

你不必與結構C *這個問題,因爲一個結構既保留了一個指向結構ç和指針的大小是已知的編譯器。但是,你需要使用前聲明它,如果它沒有前結構定義的

struct B { 
    int b; 
} 
struct C; 
struct A { 
    struct B variable1; // valid 
    struct C *variable2; // valid 
    struct D variable3; // invalid 
    struct D* variable4; // invalid 
}; 

struct C { 
    int c; 
} 

struct D { 
    int d; 
} 
1

要聲明的struct B一個實例中,struct B的定義必須是完整。幽州

其中包含結構B和結構C中聲明的頭文件不包含在這個頭文件

此時編譯器不知道是什麼struct B樣子,所以類型是不完整;因此它將拒絕任何試圖創建實例struct B的聲明,例如variable1的聲明。您可以可以聲明一個指向不完整類型的指針,就像您使用variable2一樣,因爲結構指針類型都具有相同的大小和表示。

然後你說出

,但就算我有他們這都沒有區別

強烈建議(對我來說,反正)struct Astruct B之間循環依賴,這是壞朱朱。 struct A不能完成,直到struct B完成,並且struct B不能完成,直到struct A完成。將variable1更改爲struct B的指針應該足以打破該依賴關係。

如果是這樣,您可能需要重新訪問您的設計。