首先声明,简单的头文件重复包含问题不在此文的讨论范围之内,此问题可以通过下面的文件格式进行解决。
#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
{
    AAA *p;
    int aa;
    int bb;
}BBB;
如何实现?

答案:

struct B;
typedef struct A
{
     struct B *p;
     int a;
     int b;
}AAA;

typedef struct B
{
    struct A *p;
    int aa;
    int bb;
}BBB;

或者

typedef struct A AAA;
typedef struct B BBB;

struct A
{
  BBB *p;
  int a;
  int b;
};

struct B
{
  AAA *p;
  int aa;
  int bb;
};

相互引用的结构体的定义相关推荐

  1. keil 结构体引用_结构体 自引用

    转载网址:http://tscsh.blog.163.com/blog/static/20032010320138249183520/ 今天关于结构体一些疑问,在这里标记一下 1.定义与声明 结构体的 ...

  2. c语言 结构成员 变量引用,C++结构体变量的引用

    在定义了结构体变量以后,当然可以引用这个变量,常用的方法有以下几种. 1) 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量. 如上面的student1和student2都是student类 ...

  3. 上期所API头文件一、ThostFtdcUserApiStruct.h---API结构体的定义及工作流程(源代码6.3.19版)

    结构体的定义及工作流程 一.API工作流程 1.1.MdApi 1.2.TraderApi 二. ThostFtdcUserApiStruct结构体的定义 三.源代码 一.API工作流程 1.1.Md ...

  4. C语言结构体的定义与使用、结构体数组、指向结构体的指针(有代码详解)

    1.结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数 ...

  5. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  6. c++结构体定义和使用_【C语言更新】结构体的定义及使用

    文/Edward首先先思考一个问题,假设某一天你去了一家策划公司,接到了一个策划需求,比如为新上市的某款手机写一个市场推广的文案,并且在电脑上面打印出来.那么在写这个文案的时候,你肯定是会需要着重地去 ...

  7. IMX6的相关音频结构体的定义

    在IMX上的音频接口主要有3种接口,分别为SSI, SPDIF, ESAI 等: platform 连接 codec 与 cpu 的驱动时,通过内核函数结构体static struct snd_soc ...

  8. C语言高级编程:结构体中定义数组的“妙用”

    1. 说明 1)相同类型结构体变量可以直接赋值 2)在结构体中定义一个数组,可以用赋值语句拷贝整个数组,这也是数组间赋值的一个间接实现方式 3)在结构体中定义一个数组,可以传值调用的方法把它传递给函数 ...

  9. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

    #include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...

最新文章

  1. 我的业务要不要用人工智能?引入AI前你需要评估的(一)
  2. 按树型显示BOM的结构
  3. 2013年中国高校网购实力排行榜
  4. ffmpeg 解码卡死
  5. 小猪学设计模式——工厂模式之抽象工厂
  6. java多态替换switch_使多态性无法解决那些switch / case语句的麻烦
  7. java打印结果横向排列_Java8排列组合(6行代码实现)
  8. linux基础_centos安装与网络配置
  9. 大数据管理:构建数据自己的“独门独院”
  10. MySQL在并发场景下的问题及解决思路
  11. join为什么每个字符都分割了 js_js如何截取以逗号隔开的字符串
  12. RecycleView多布局的实现
  13. win10u盘被写保护怎么解除_win10系统U盘提示磁盘被写保护的解决办法
  14. 如何在Excel中隐藏单元格,行和列
  15. RHEL配置网卡vlan tag
  16. 微信小程序wx.setClipboardData复制文本
  17. 基于组件开发——应用软件开发的革命
  18. 贝叶斯和EM算法简介
  19. Kotlin Flow 背压和线程切换竟然如此相似
  20. php获取判断图片大小,php 获取图片尺寸的方法

热门文章

  1. 拿捏大厂面试,2022最新版的Java面试突击班手册
  2. 一篇入门级Scrapy框架(校花网)
  3. R包rdist、Python sklearn计算pairwise distance
  4. 从零开始学数据分析之——《线性代数》第一章 行列式
  5. 511遇见易语言大漠多线程自动切换账号循环登录任务模板
  6. GOJ 1211 -- 花开雷霆崖 简单分治算法的应用
  7. 3 个月从月薪 6k 涨到 15k 的面试题(java岗)
  8. 【计算机系统】 信息在计算机中的表示和内存地址与空间的简单理解
  9. 如何解决电脑开始菜单任务栏和操作中心灰色无法勾选
  10. 有效数字的保留规则python_关于小数有效数字保留的方法