相互引用的结构体的定义
首先声明,简单的头文件重复包含问题不在此文的讨论范围之内,此问题可以通过下面的文件格式进行解决。
#ifndef __filename_h__
#define __filename_h__
/* code */
#endif
我们这里讨论的头文件互相包含是文件中的内容有互相引用的情况。比如test_a.h文件中定义了结构体TEST_A_S,test_b.h文件中定义了 结构体TEST_B_S,且TEST_A_S引用了TEST_B_S,同时TEST_B_S也引用了TEST_A_S。
此问题的本质就是结构体的互相引用,下面我们对结构体互相引用的问题进行分析,而对于头文件互相包含的问题不再特别指出。
通常情况下,我们写作结构体的时候都是声明和定义一起做的,不会单独对要定义的结构体进行声明。对于要引用的结构体,我们把它放在定义的结构体前面即可。
但有这样一种情况:两个结构体互相引用,也就是两个结构体互相成为对方的成员变量。此时,我们应该如何来组织我们的数据结构呢?
这时,我们可以使用声明实现两个结构体的互相引用,即先在前面对其中的某个结构体进行声明。声明之后,我们就可以互相引用了。
样例1(正确样例):
typedef struct tagTest_B TEST_B_S;
typedef struct tagTest_A
{
TEST_B_S *pstB;
} TEST_A_S;
struct tagTest_B
{
TEST_A_S *pstA;
};
看完上面这个样例,大家再来看看下面这个例子,看一下有没有什么问题?
样例2(错误样例):
typedef struct tagTest_B TEST_B_S;
typedef struct tagTest_A
{
TEST_B_S stB;
} TEST_A_S;
struct tagTest_B
{
TEST_A_S *pstA;
};
如果我们使用VC进行编译(当然你也可以使用GCC编译),VC编译的时候会报错,如下:
error C2079: 'stB' uses undefined struct 'tagTest_B'
这是什么原因呢?
这是因为声明的时候只是简单的表明是某种结构体而已,而结构体的内容我们不得而知。
因此我们引用的时候只能使用指针而不能直接使用结构体,因为只有这样才能为结构体分配确定的内存
(指针的内存始终是4字节,而未知结构体的内存大小是不确定的)。
另外,顺便看一下下面这种写法。
样例3(pclint会有Info提示):
typedef struct tagTest_B TEST_B_S;
typedef struct tagTest_A
{
TEST_B_S *pstB;
} TEST_A_S;
typedef struct tagTest_B
{
TEST_A_S *pstA;
} TEST_B_S;
上面这样写,使用Lintware软件做pclint时,会提示说TEST_B_S重复定义(Info等级),这是因为两次使用typedef定义了 TEST_B_S。Lintware要求比较严格,实际上就这样写也是可以通过VC编译并且正常运行的,不用太在意。
------
我想定义两个结构体, typede struct A { BBB *p; int a; int b; }AAA; typedef struct B |
答案:
struct B; typedef struct A { struct B *p; int a; int b; }AAA; typedef struct B |
或者
typedef struct A AAA;
typedef struct B BBB;
struct A
{
BBB *p;
int a;
int b;
};
struct B
{
AAA *p;
int aa;
int bb;
};
相互引用的结构体的定义相关推荐
- keil 结构体引用_结构体 自引用
转载网址:http://tscsh.blog.163.com/blog/static/20032010320138249183520/ 今天关于结构体一些疑问,在这里标记一下 1.定义与声明 结构体的 ...
- c语言 结构成员 变量引用,C++结构体变量的引用
在定义了结构体变量以后,当然可以引用这个变量,常用的方法有以下几种. 1) 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量. 如上面的student1和student2都是student类 ...
- 上期所API头文件一、ThostFtdcUserApiStruct.h---API结构体的定义及工作流程(源代码6.3.19版)
结构体的定义及工作流程 一.API工作流程 1.1.MdApi 1.2.TraderApi 二. ThostFtdcUserApiStruct结构体的定义 三.源代码 一.API工作流程 1.1.Md ...
- C语言结构体的定义与使用、结构体数组、指向结构体的指针(有代码详解)
1.结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数 ...
- 结构体中定义函数指针
结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...
- c++结构体定义和使用_【C语言更新】结构体的定义及使用
文/Edward首先先思考一个问题,假设某一天你去了一家策划公司,接到了一个策划需求,比如为新上市的某款手机写一个市场推广的文案,并且在电脑上面打印出来.那么在写这个文案的时候,你肯定是会需要着重地去 ...
- IMX6的相关音频结构体的定义
在IMX上的音频接口主要有3种接口,分别为SSI, SPDIF, ESAI 等: platform 连接 codec 与 cpu 的驱动时,通过内核函数结构体static struct snd_soc ...
- C语言高级编程:结构体中定义数组的“妙用”
1. 说明 1)相同类型结构体变量可以直接赋值 2)在结构体中定义一个数组,可以用赋值语句拷贝整个数组,这也是数组间赋值的一个间接实现方式 3)在结构体中定义一个数组,可以传值调用的方法把它传递给函数 ...
- c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配
#include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...
最新文章
- 我的业务要不要用人工智能?引入AI前你需要评估的(一)
- 按树型显示BOM的结构
- 2013年中国高校网购实力排行榜
- ffmpeg 解码卡死
- 小猪学设计模式——工厂模式之抽象工厂
- java多态替换switch_使多态性无法解决那些switch / case语句的麻烦
- java打印结果横向排列_Java8排列组合(6行代码实现)
- linux基础_centos安装与网络配置
- 大数据管理:构建数据自己的“独门独院”
- MySQL在并发场景下的问题及解决思路
- join为什么每个字符都分割了 js_js如何截取以逗号隔开的字符串
- RecycleView多布局的实现
- win10u盘被写保护怎么解除_win10系统U盘提示磁盘被写保护的解决办法
- 如何在Excel中隐藏单元格,行和列
- RHEL配置网卡vlan tag
- 微信小程序wx.setClipboardData复制文本
- 基于组件开发——应用软件开发的革命
- 贝叶斯和EM算法简介
- Kotlin Flow 背压和线程切换竟然如此相似
- php获取判断图片大小,php 获取图片尺寸的方法