结构体的不完整声明

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

如下面这个例子:

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。

时间: 2024-07-30 15:52:57

结构体的不完整声明的相关文章

结构体的声明与定义分离

最近看到一种比较新颖的写法 -- 结构体在头文件中声明, 源文件中定义 A.h typedef struct Context Context; A.cpp #include "stdafx.h" #include "A.h" struct Context { int param; char *str; }; 原以为这样应该会报错, 因为头文件中的 "struct Context" 应该是找不到的, 但amazing, 竟然能顺利编译过, 由此让我

[C/C++基础] 3.结构体、共用体、枚举

概述: 结构体和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,其次相同结构的结构体变脸是可以相互赋值的. 共用体(联合体)和结构体都是由多个不同的数据类型成员组成,但在任何同一时刻,共用体值存放了一个被选中的成员.而结构体的所有成员都存在. C++的枚举(enum)工具提供了另外一种可以替代const来创建符号常量的方式,枚举表是枚举常量的集合. 3.1 结构体struct 结构体类型变量的定义一般形式为: struct 结构体类型名{ 类型1 成员名1; 类型2 成员名2;

C语言08字符串 & 预处理 & 结构体

项目开发中字符串模型建立 strstr的while dowhile模型 //int cltClient_rev(void *handle, unsigned char *buf, int *buflen) //不要相信别人给你传送的内存地址是可用的 int getCout(char *str, char *substr, int *count) { int rv = 0; char *p = str; int ncout = 0; if (str==NULL || substr== NULL |

枚举与结构体

枚举与结构体 枚举 enum 枚举的作用是用来增加代码的可读性,限制变量的使用范围.枚举有以下特点: 一个完整的枚举包括关键字enum.变量名.{}以及枚举值,例如: enum Fruits{    Apple,    Orange,} 枚举变量的声明要使用变量名,枚举值的调用也要使用变量名,使用如下: Fruits apple = Fruits.Apple; 枚举字面值属于整型,默认是int类型,可以通过在变量名后指定某一值类型,枚举可选的整型包括:byte.sbyte.short.ushor

iOS-C_Day13___结构体

2015.2.4 #include <stdio.h> #include <string.h> //struct //struct Goods //{ //    char name[20]; //    float price; //    long amount; //}; // //int main(int argc, const char * argv[]) { //    struct Goods book; //    strcpy(book.name,"三国

结构体定义struct和typedef struct

  分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是struct Student的别名.Stu==struct Student 另外这里也可以不写Student(于是也不能struct Student stu1;了,必须是S

C语言 结构体篇

结构体:是一种构造类型 它是由若干成员组成的 其中每一个成员都可以是一个基本数据类型或者又是一个构造类型 定义结构体变量后,系统就会为其自动分配内存 为了便于更大的程序便于修改和使用  常常将结构体类型的变量声明在一个头文件中 这样在其他源文件中如果需要使用该结构体类型就可以用#include命令将该头文件包含到源文件中 结构体的定义: (1) 常用的一种定义方式 1 struct 结构体名 { 2 3 成员列表; 4 5 }; (2)定义结构体类型的同时,定义该类型的变量 1 struct 结

数据封装-结构体

结构体类型作用 *结构体类型允许程序员把一些分量聚合成一个整体,用一个变量表示. *一个结构体的各个分量都有名字,把这些分量称为成员(member). *由于结构体的成员可以是各种类型的,程序员能创建适合于问题的数据集合. 结构体类型的定义 *定义结构体类型中包括哪些分量 *格式: struct 结构体类型名{ 字段声明; }; 注意 *字段名可与程序中的变量名相同 *在不同的结构体中可以有相同的字段名 *结构体成员的类型可以是任意类型,当然也可以是结构体类型 结构体变量的初始化 student

【Go语言】【13】再谈GO语言的结构体

本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struct{ name,address string height,weight float64 } /*初始化结构体,并赋给变量emp*/ emp := employee{name:"eagle",