2011-08-08 79 views
1

我有這兩種結構的...爲了兩個結構

typedef struct{ 
    MY_SECOND_STRUCT s1; 
}MY_FIRST_STRUCT; 


typedef struct{ 
    int s1; 
}MY_SECOND_STRUCT; 

我喜歡這個順序,我不希望他們進行切換。 但是編譯器不知道此刻MY_SECOND_STRUCT,我得到錯誤

error: expected specifier-qualifier-list before 'MY_SECOND_STRUCT'

從來就試圖定義添加聲明頂端

struct MY_SECOND_STRUCT; 

也改爲

typedef struct{ 
    struct MY_SECOND_STRUCT s1; 
}MY_FIRST_STRUCT; 

但它沒有幫幫我。

+1

這裏的其他答案很好。您可能想知道爲什麼您可以轉發聲明結構,然後聲明一個指針 - 編譯器知道指針的大小,因此它可以確定包含它的結構的大小,但它不知道大小第二個結構,所以它不能定義一個包含它的結構。 –

回答

3

該訂單是不可能的。你必須切換它們。

但是,如果你聲明成員爲指針,然後切換不要求:

struct MY_SECOND_STRUCT; //forward declaration is required though 

typedef struct{ 
    MY_SECOND_STRUCT * s1; //now its a pointer 
}MY_FIRST_STRUCT; 

或者,在C++中,你可以使用模板:

template<typename MY_SECOND_STRUCT> 
struct MY_FIRST_STRUCT_T 
{ 
    MY_SECOND_STRUCT s1; 
}; 

struct MY_SECOND_STRUCT 
{ 
    int s1; 
}; 

而當你要使用MY_FIRST_STRUCT,只要使用此typedef

typedef MY_FIRST_STRUCT_T<MY_SECOND_STRUCT> MY_FIRST_STRUCT; 

使用現在。 :-)

+0

如果我將成員聲明爲指針,並在寫入時添加前向聲明,則仍然會出現錯誤。我必須寫 ** struct MY_SECOND_STRUCT * s1; ** 比它好。 (我的編譯器gcc) – Meloun

+0

@Meloun:這是我寫的。或者你在C編程?什麼是文件擴展名? '.c'或'.cpp'? – Nawaz

8

I prefer this order, I dont want to switch them.

您必須切換它們。

如果MY_FIRST_STRUCT具有MY_SECOND_STRUCT類型的成員變量然後MY_SECOND_STRUCT必須定義和MY_FIRST_STRUCT定義之前完整(不只是聲明和不完全)。

1

當你cerate你的第一個結構時,編譯器還沒有遇到第二個結構。它需要知道位MY_SECOND_STRUCT是怎麼回事,因爲那時它需要決定製作MY_FISRT_STRUCT有多大,以及如何爲它配置內存。簡單地說,聲明struct MY_FIRST_STRUCT是不夠的,它不會告訴編譯器關於結構的大小或內容。如果您正在使用指向結構的指針,則前向聲明將會起作用,但在嘗試包含實際結構時,它是不夠的。

您唯一的實際選擇是移動MY_SECOND_STRUCT以上MY_FIRST_STRUCT或使MY_FIRST_STRUCT需要一個指針。起初可能看起來很奇怪,但對此沒有太多可以做的。