2011-03-16 65 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) = ... ... } } } } } } 

总之,不能计算出的大小,因为它的大小取决于其本身是未知的。

所以尺寸是不确定的。