C语言 匿名联合体和匿名结构体

匿名联合体和匿名结构体顾名思义,就是没有名字的联合体和结构体,没有名字哪怎么用?拿来用?

在嵌入式数据通信里面,大部分都是使用联合体,将有实际意义的结构体和字节数组互相转换。

typedef struct
{uint8_t head;     //头uint8_t cmd;      //功能字int16_t x;        //传感器x轴数据int16_t y;        //传感器y轴数据int16_t z;        //传感器z轴数据uint8_t end;      //尾uint8_t checkSum; //校验
}Packet_t;typedef union
{uint8_t data[10];Packet_t packet;
}Datagram_t;Datagram_t datagram;

如上所示,如果已经通过 datagram.data 接收到数据,想要从数据中提取传感器x轴数据,则只要通过 datagram.packet.x 就可以获取x轴数据。

上面的 Datagram_t 联合体中可以将 Packet_t packet;成员使用匿名结构体替换

typedef struct
{uint8_t head;     //头uint8_t cmd;      //功能字int16_t x;        //传感器x轴数据int16_t y;        //传感器y轴数据int16_t z;        //传感器z轴数据uint8_t end;      //尾uint8_t checkSum; //校验
}Packet_t;typedef union
{uint8_t data[10];Packet_t;         //不给实际名字
}Datagram_t;Datagram_t datagram;

这时想要从数据中提取传感器x轴数据,则只要通过 datagram.x 就可以获取x轴数据。

但是如果还想要保留 datagram.packet.x 这样的访问方式,怎么办?

#define INHERIT_EX(__TYPE, __NAME)  \union                   \{                       \__TYPE;             \__TYPE  __NAME;     \};typedef struct
{uint8_t head;     //头uint8_t cmd;      //功能字int16_t x;        //传感器x轴数据int16_t y;        //传感器y轴数据int16_t z;        //传感器z轴数据uint8_t end;      //尾uint8_t checkSum; //校验
}Packet_t;typedef union
{uint8_t data[10];INHERIT_EX(Packet_t, packet);
}Datagram_t;Datagram_t datagram;

可以在联合体 Datagram_t 内部在创建一个匿名联合体

    union                 {           Packet_t;           Packet_t  packet;    };

匿名联合体中再加上一个匿名结构体 Packet_t;
这样 就可以通过 datagram.x 和 datagram.packet.x 这两种方式访问x轴数据。

但是用了匿名联合体和匿名结构体也就是省略了调用packet 成员的步骤。
就省略了一个步骤,也没啥太大作用啊!这里的确是没有发挥太大作用,但是使用C语言开发大型项目,使用面向对象思想开发时,这个就很有用了。尤其是多层继承时,A结构体继承与B结构体、B结构体又继承C结构体… 使用匿名联合体的优势就体现出来了,A可以直接调用结构体B、C…的所有成员。

最后嵌入式开发常见的几个C编译器比如IAR MDK GCC等都是支持的匿名联合体和结构体的,如果不支持可以粘贴下面的代码到自己的系统头文件中,就可以让你的匿名代码在意思几个环境下获得支持。

/* -------------------  Start of section using anonymous unions  ------------------ */
#if defined(__CC_ARM)#pragma push#pragma anon_unions
#elif defined(__ICCARM__)#pragma language=extended
#elif defined(__GNUC__)/* anonymous unions are enabled by default */
#elif defined(__TMS470__)
/* anonymous unions are enabled by default */
#elif defined(__TASKING__)#pragma warning 586
#else#warning Not supported compiler type
#endif

C语言 匿名联合体和匿名结构体相关推荐

  1. Go 语言快速入门指南:结构体

    Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念. Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 1. 类型别名和自 ...

  2. Go语言全栈开发:结构体

    文章目录 类型别名和自定义类型 结构体 练习题 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象 ...

  3. C语言中函数如何返回结构体?

    //#include "stdafx.h"//If the vc++6.0, with this line. #include "stdio.h" #inclu ...

  4. C语言学生信息管理系统(结构体数组,文件)

    C语言学生信息管理系统(结构体数组,文件) 这是初学时写的一个程序,比较菜,不喜勿喷.在一个结构体里定义结构体内所有的信息(如果信息也需要分类则可以再定义一个结构体并在当前结构体内声明,我的这个代码在 ...

  5. Nwafu-Oj-1444 Problem l C语言实习题七——2.结构体数组的定义与引用

    问题 : C语言实习题七--2.结构体数组的定义与引用 时间限制: 1 Sec  内存限制: 128 MB 提交: 4459  解决: 2011 [提交][状态][讨论版] 题目描述 定义一个职工结构 ...

  6. c语言用数组直接填充结构体,C语言第11题:结构体数组的定义与使用 + 结构体数组排序...

    C语言第11题:结构体数组的定义与使用 + 结构体数组排序 C语言第11题:结构体数组的定义与使用 + 结构体数组排序 注意: 一下赋值是不能使用的 但是在结构体中是可以直接进行赋值操作的 st[1] ...

  7. C语言 泛型链表 如何计算(结构体中各元素)相对内存地址?(字节对齐,结构体对齐)offsetof()函数 ( (struct X*)0 ) -> Y)语法(匿名结构体)

    示例: typedef struct _user {char name[20];char sex[20];int age;struct list_head mylist;//自定义结构体里保存双向循环 ...

  8. 【C语言】自定义类型(结构体、位段、枚举、联合体)与内存对齐

    目录 一.自定义类型种类 1.结构体 2.位段 3.枚举 4.联合体(共同体) 二.结构体 1.结构体的声明 2.结构体变量的定义与初始化 1.定义 2.结构体变量的初始化 3.结构体成员的访问 1. ...

  9. C#:钩子、委托、匿名、事件、结构体转字节数组、多线程操纵控件、UDP

    事件 C#事件分为几个步骤: 定义事件 定义处理函数 为事件添加处理函数 激活事件 事件被激活后自动调用处理函数. public event messagehandleer shenzhijiangl ...

最新文章

  1. 设计模式之装饰模式(Decorator)摘录
  2. 用Leangoo项目管理工具怎么做多团队大规模Scrum敏捷开发?
  3. java 数据分析库_超级好用的 Java 数据可视化库:Tablesaw
  4. prepare 和 row_count()一起使用的误区
  5. 【Python基础】加密你的Python源码顺便再打个包如何?
  6. mysql 计算gps坐标距离_mysql、sqlserver和php计算GPS经纬度坐标距离
  7. 2019.2.4 nfs原理和安装实验
  8. C# 使用Timer控件设置时间间隔
  9. TTSR再次理解,主要是针对Texture Transformer TT的全部过程的一个梳理
  10. Vue Cli 3.x项目如何部署到IIS子站点下
  11. net 架构师-数据库-sql server-触发器
  12. android DisplayMetrics
  13. pythonsys用法_Python 使用sys模块
  14. postMessage 实现跨源通信 iframe 跨域获取url
  15. 计算机组成原理----Cache主存地址映射(计算题)
  16. windows镜像_Windows 系统镜像下载地址
  17. Python爬虫系列(二)——Python爬虫批量下载百度图片
  18. mysql中的去除空格函数
  19. word中快速确认字体颜色的方法
  20. matlab表示网络,Matlab绘制网络

热门文章

  1. 使用hibernate建立mysql连接以及生成映射类和配置文件*.cfg.xml
  2. COJ 1008 WZJ的数据结构(八) 树上操作
  3. JS 控制RadioButtonList 获得上传文件类型后选中
  4. Oracle服务自动启动脚本
  5. android 单个模块编译的方法
  6. To rename a docker image
  7. SylixOS普通定时器精度分析
  8. 「超全」工欲善其事必先利其器!
  9. [Android Pro] Android源码编译后,再重编译所需要做的清理工作
  10. Rider首个发布候选版加入了性能提升特性