struct A {
struct B b;
};
struct B {
struct A a;
};
答案 0 :(得分:5)
它无效,在C
等程序语言中不需要。 (对于对ex:Haskell
)进行延迟评估的语言可能很有用。
想象一下你的例子的用例
struct A {
struct B b;
};
struct B {
struct A a;
};
Struct A a;
a.b.a.b.a.b.......[infinitely]
但有时您需要将A
和B
类型的结构相互引用,在这种情况下,您可以使用指针。
struct child;
struct parent;
struct child {
...
struct parent *pParent;
};
struct parent {
...
struct child *children[2];
};
现在可能的用例是:
struct child pikachu;
...
if(pikachu.pParent != NULL) {
struct child *pPikachuSibling;
pPikachuSibling = (pikachu.pParent.children[0] == &pikachu) ?
pikachu.pParent.children[1] :
pikachu.pParent.children[0];
if(pPikachuSibling != NULL) {
do_something_with(pPikachuSibling);
}
}
在C
中,字段不能包含incomplete type [a] ,但允许字段指向不完整类型。
关于Self referential struct,使用指针,可以达到这个要求。
assert( pikachu.pParent.children[0] == &pikachu) ||
pikachu.pParent.children[1] == &pikachu) );
[a]引自ISO/IEC 9899:TC2 Committee Draft — May 6, 2005 WG14/N1124
功能
109)只有在不需要该类型对象的大小时才能使用不完整类型。它不是 例如,当typedef名称被声明为结构或联合的说明符时,或者 当声明指向返回结构或联合的指针或函数时。 (见不完整的类型 在6.2.5中。)在调用或定义这样的函数之前,必须完成规范。
6.2.5类型
22未知大小的数组类型是不完整类型。它是 对于该类型的标识符,通过指定a中的大小来完成 后来申报(内部或外部联系)。结构或 未知内容的联合类型(如6.7.2.3中所述)是一种 不完全类型。对于该类型的所有声明,它已完成, 通过声明与其定义内容相同的结构或联合标记 后来在同一范围内。