C中的相互参照结构

时间:2014-05-24 04:49:16

标签: c

struct A { 
    struct B b;
};
struct B {
    struct A a;
};
  • 请解释这些结构声明 - 它们有效吗?
  • 是否有任何此类声明的申请 - 如果是,您能举例说明吗?
  • 这些自我参照结构吗?

1 个答案:

答案 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]

但有时您需要将AB类型的结构相互引用,在这种情况下,您可以使用指针。

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中所述)是一种   不完全类型。对于该类型的所有声明,它已完成,   通过声明与其定义内容相同的结构或联合标记   后来在同一范围内。