2011-03-16 39 views
2

這工作:問題在裏面本身定義結構的對象

struct LD__32 
{ 
    struct LD__32 *ld; 
}; 

但這並不:

struct LD_32 
{ 
    struct LD_32 ld; 
}; 

這是爲什麼? 我正在編譯它作爲pmg猜測的C++代碼。編輯

+1

您是否將代碼編譯爲C++?在C中,在範圍中沒有'typedef',類型名稱是'struct LD__32'。試着打印'sizeof'a''的值:如果它不是1,那麼你確定;如果它是1,則測試結果不確定(但您可能正在編譯爲C++) – pmg 2011-03-16 18:22:05

+0

@pmg:或者更簡單的測試,打印'__cplusplus'(作爲'long')的值。在沒有符合C99編譯器的情況下,以及沒有任何其他類型C的已知編譯器將被定義。 – 2011-03-17 22:09:08

+0

謝謝你@Steve。我不知道C++。是否所有(標準)C++編譯器實現都保證定義'__cplusplus'符號? – pmg 2011-03-17 22:25:17

回答

5

C中的結構不能包含不完整類型的成員。

在後一種情況下,您不能在LD_32定義中定義LD_32 ld;,因爲結構LD_32尚未在此處定義。

退房constaints結構上用C

第6.7.2.1/2

結構或聯合不得含有具有不完整或功能類型(因此一個構件, 結構不得包含它自己的一個實例,但可能包含一個指向其本身實例的指針),除了具有多個命名成員的結構的最後一個成員可能具有不完整的數組類型;這樣的結構(以及任何可能遞歸地包含這種結構的成員的聯合)不應該是結構的成員或陣列的元素。

2

因爲這是一個遞歸和無限的定義。想想看。

2

想想

sizeof(struct LD_32) 
+1

在這種情況下,它可能是1.或者任何數字,真的。當有其他結構成員的時候,這個論證就變成了決定性的。 – 2011-03-16 18:02:07

+2

我認爲當sizeof()這樣的編譯時表達式可以具有任何值時,這足以說明問題:-)。 – 2011-03-16 18:08:57

+0

我的意思是實現可以選擇任何數字,就像它必須爲空結構的大小選擇一個數字一樣。 1是明顯的選擇。這個結構體不會呈現大小相關的矛盾,例如'struct LD {LD ld; int x;}'提出矛盾。考慮'sizeof(int)'是另一個可以是實現選擇的數字的例子。在「int」的情況下,當然有些選擇比其他選擇更容易實現,但是就標準而言,實現具有自由的事實不是問題...... – 2011-03-16 18:16:11

0
struct LD_32 
{ 
    LD_32 ld; 
}; 

在這種情況下,你怎麼會想到編譯器,以確定結構LD_32的大小。

結構的大小是通過計算所有成員的大小加上一些填充確定的。

所以,即使沒有填充,這種結構LD_32的大小將等於大小的它的成員是LD_32本身,這意味着,

sizeof(LD_32) = size of member { size(LD_32) = size of member { size(LD_32) = size of member { size(LD_32) = ... ... } } } } } } 

總之,不能計算出的大小,因爲它的大小取決於其本身是未知的。

所以尺寸是不確定的。