结构体的不完整声明

时间:2022-03-12 02:10:58

 

首先解释一下啥是结构体的不完整声明:

 

如下面这个例子:

struct B;    //对结构体B进行不完整声明

 

程序中突然出现这么一句是干什么用呢?请看下面的程序:

struct B;    //对结构体B进行不完整声明
  
//结构体A中包含指向结构体B的指针
struct A
{
     struct B *partner;
     //other members;
};
  
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
     struct A *partner;
     //other members;
};
 
 
这下明白了吧?

有时候,你必须声明一些相互之间存在依赖的结构。即:其中一个结构包含了另一个结构的一个成员或多个成员。和自引用一样,至少有一个结构必须在另一个结构体内部以指针的形式存在。问题在于声明部分:如果每个结构都引用了其他结构的标签,哪个结构应该首先被声明呢?

1>该问题采用不完整声明来解决。它声明一个作为结构标签的标识符。然后,把这个标签用在不需要知道这个结构的长度的声明中,如声明指向这个结构的指针。接下来的声明把这个标签与成员列表联系在一起。

 

 

 

Linux的代码中,在linux/sched.h中就有这么一个声明:

struct task_struct;

作用即是上面所述。

至于不完整声明,应该是源于英文的incomplete declaration 或者是 forward declaration。