在文章最后提到之前的隐藏结构体成员的方法是一种完全私有的封装无法做到"公私分明",这样通过函数调用在MCU中会存在较大的开销。
1、原理与技巧
那时候bug菌就在想有什么办法可以做到私有成员与公共成员区别对待呢?
既然.h文件中的不完全类型仅仅只是一个啥也不含的结构体空壳,那么根据结构体的内存模型以及我们平时经常提到的C语言面向对象设计中的继承处理。
于是便编写了如下代码来验证我的想法:
参考代码:



输出结果:

从输出结果上来看编译正常,且输出了正确的结果,member1可被外界直接访问,而member2只能通过App.c内部直接访问,或者通过定义外部函数接口进行间接访问,否则就会报错。一顿猛如虎的操作竟然验证了自己的一些想法。
2、优化版本
后来又想了想,如果成员比较多,不是特别好管理,于是尝试了一个更好的成员管理方式:
参考代码:




输出结果:

编译OK,完工,是不是感觉有一股C++的味道了,如果你还没有看懂的话,记得多看几遍,因为这种处理方式算是非常常见的~
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
mcu
+关注
关注
147文章
19241浏览量
405204 -
接口
+关注
关注
33文章
9636浏览量
157815 -
C语言
+关注
关注
183文章
7649浏览量
146420
发布评论请先 登录
相关推荐
热点推荐
关于C语言对齐的一些总结
1. 对齐的目的是什么? 提供访问效率---放大对齐 压缩存储空间---紧凑对齐 2. 对齐的类型有哪些? 自然对齐 :结构体默认按 最大基础类型成员 的大小对齐(比如最大
GLAD应用:体全息光栅模拟
。从而用于模拟全息记录介质中形成的梯度折射率分布。体全息结构一旦形成,就可以在传输过程中将一束入射光波逐渐转换成形成体全息结构的另一束光波。两束光波之间的能量传递转换效率与
发表于 04-24 08:25
鸿蒙智能体上/下架、升级流程介绍
执行上架操作,并且已经审核通过的智能体,才能被其他用户搜索并使用。
升级审核未通过的智能体,线上依旧保留上一次通过审核的智能体版本提供给其他用户使用。
下架后的智能体,用户无法再使用。
发表于 02-10 10:38
一个经典的结构体和联合体共用的实例
Linux 中可以 使用 sizeof 进行获取,默认为字节对齐的大小。
联合体
联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存共享等。
结构体和联合体
发表于 12-16 07:14
结构体声明与定义
1、声明
结构体的声明使用struct关键字,如果我们想要把我们的学籍信息组织一下的话,可以这样表示:
struct Info
{
unsigned long identifier;//学号
发表于 12-11 07:52
为什么不建议用匿名结构体
: invalid use of ‘struct data_def::::value_bit’
有可能有方法可以设置 gcc 编译支持匿名结构体,但是鱼鹰也不想深究,改了就是。
因此
发表于 12-04 07:39
C语言的编程技巧
1、宏定义使用do{...}while(0):当宏定义中包含多条语句时,使用do{...}while(0)可以避免语句嵌套问题,确保宏的独立性。
2、灵活数组成员:C99标准允许结构体
发表于 11-27 06:46
C语言结构体使用
有时候需要将不同类型的数据组合为一个整体,以便于引用。例如,一名学生有学号、姓名、性别、年龄等属性,如果针对每个属性都单独定义一个变量,那么当有多名学生时变量就难以分清。结构体就是用来
发表于 11-12 08:30
can_sample例程,rxmsg.hdr = -1;语句报错如何解决?
使用官方CAN_sample例程编译,cubemx已经配置好CAN引脚,menuconfig也已经打开相关接口,但编译时报错,显示结构体 rt_can_msg结构体中没有hdr这个
发表于 09-24 07:05
定义IO初始化结构体
由上述IOPORT相关功能的枚举类型我们可以知道,在对IOPORT模块进行初始化时需要根据情况配置它们。因此我们定义一个IOPORT初始化的结构体类型IOPORT_Init_t,它的成员
有什么办法可以做到私有结构体成员与公共结构体成员区别对待呢?
评论