首页
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
更多
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
嵌入式 C 语言知识点,掩码结构体
文摘
2024-07-09 22:30
英国
我是老温,一名热爱学习的嵌入式工程师
关注我
,一起变得更加优秀!
前面的一系列技术文章,我们都曾多次充分说明了,在设计业务逻辑复杂的嵌入式软件时,最好以面向对象作为基本的设计思想,对各个功能模块尽可能地做好封装与解耦。关于嵌入式
C
语言面向对象设计的文章,可以点击以下链接进行回顾:
基于状态机和面向对象的思想,设计一个通用的按键检测模块。
基于面向对象和简单工厂模式,设计一个通用的 LED 显示模块。
嵌入式 C 语言面向对象编程 --- 总结
面向对象是一种基本的设计思想,与所采用的编程语言基本无关
(
如果非要杠汇编和二进制,那就是你对
)
,一个反面的例子就是,很多人在初学C++的时候,即便C++里面集成了很多面向对象设计的语法糖,但初学者依然会很容易把“类”当作结构体使用。
面向对象的基本出发点是:把“数据属性”与“数据属性的处理方法”都封装在一起。而我们在使用 C 语言进行嵌入式功能模块设计的时候,因为C语言并不具备C++语言的语法糖,所以通常都会使用结构体的方式来模拟类的设计。
因此,我们在使用OOC(Object-Oriented C Programming with ANSI -C)技术的时候,通常都会面临以下问题:
“嗯,我们可以使用结构体来模拟类,把所有数据变量和函数指针都放在结构体里面进行封装,并且把这个结构体放在接口头文件里面,那么问题来了,结构体里面的成员都是public的(语法层面可以直接使用),但某些数据变量却是private属性(不允许被模块外部直接调用)”
那么,应该如何解决这个问题呢?
在我以往编写的 C 语言面向对象文章里面,示例代码的接口头文件,通常都伴随着这个“直接且尖锐”的问题,而通过编码和模块引用规范这一系列的“君子协定”,往往只能起到“防君子而不能防小人”的作用。
直到最近,我看了傻孩子大佬(公众号:裸机思维)的一系列文章才知道,原来C语言里面有一种技法,
掩码结构体(Masked Structure)
,可以为结构体里面的private属性变量盖上一层蒙版,模块使用者即使看到了结构体的私有数据变量,也不能对其进行外部直接访问调用。
在通用的单片机按键检测模块这篇文章里面,对于模块的接口头文件 key_module.h,里面两个最主要的结构体,key_t和key_manager_t,其内部大量暴露了模块的私有参数变量,如下图所示。
模块使用者如果想通过某些简单直接粗暴的方式,去修改模块的各个属性参数,是一件轻而易举
(
技术上也是合情合理
)
的事情,因为根据接口头文件的最小信息公开原则,放在头文件的信息内容,难道不是公开且供大家放心使用的么?~
(此刻,作者我,无言以对。。。)
鉴于key_module.h接口头文件显现出来的设计不足,我们可以使用掩码结构体对其进行改进,例如,对于原来的key_t结构体,我们可以把私有不公开的成员,放在struct __key里面,然后 key_t 结构体则改进成如下图所示的方式。
然而,这种改进并未能在真正意义上掩盖住私有成员(struct __key的信息依然表露无遗),因此,我们参考“
真刀真枪模块化(2.5)--君子协定
”这篇文章,可以通过宏定义技法,把私有成员结构体的信息,真正隐藏起来,如下图所示。
使用以上宏定义,那么我们可以继续对struct __key结构体作出进一步的改进,把结构体的声明和成员定义,都交给了预编译宏进行处理,具体代码如下图所示。
当我们需要提取结构体成员进行使用的时候,可以使用CLASS_INTERNAL宏,该宏展开后是一种强制类型转换,目的是可以通过已知类型的结构体变量,来显式调用结构体成员,使用方式如下图所示。
以上,就是使用掩码结构体技法对单片机按键模块的简单改进(以上截图多数为伪代码,提供一种思路),在实际的工程项目里面,推荐直接使用PLOOC,这个开源项目已经很完美地为C语言面向对象开发提供了必要的OOPC模板。
感谢阅读。
-END-
往期推荐:点击图片即可跳转阅读
嵌入式用 C 语言进行面向对象开发,从未试过如此简单!
嵌入式 C 语言 struct,面向对象编程的第一步
面向对象的编程思维
我是老温,一名热爱学习的嵌入式工程师
关注我
,一起变得更加优秀!
http://mp.weixin.qq.com/s?__biz=MzAxMzc2ODMzNg==&mid=2656105071&idx=1&sn=98330a6878167133cbe4a5af8635f67e
裸机思维
傻孩子图书工作室。探讨嵌入式系统开发的相关思维、方法、技巧。
最新文章
【为宏正名番外】用“C泛型”实现队列的例子:多类型支持、函数重载与线程安全
有没有一种可能性——Bootloader升级失败会变砖?
正版Jlink速度很牛么?中国开源轻松拿捏
CMSIS玩家的“阴间成就”指南
【直播预告】阿加犀基于SiRider S1芯擎开发板的机器人应用
【玩转Arm-2D】如何制作具有物理质感的仪表指针
嵌入式工程师必看!瑞芯微RK3568的“鸿蒙系统”最新发布!
防御性编程(X)OOPC开发(√)
观展攻略 | elexcon2024深圳国际电子展+嵌入式展+半导体展即将开幕,8.27-29日与您相约深圳会展中心(福田)
【更新】MDK下99%用户都不知道的万能printf方法
【快讯】树莓派发布Pico2——M33还是RISC-V,成年人不做选择!!!
在KEIL中勾选微库后,延时函数为什么不准了?
【喂到嘴边了的模块】超级嵌入式系统“性能/时间”工具箱
Semihosting真的是嵌入式阑尾么?
【警告】电子展攻略来袭!!【摊位地图】【大咖名单】【宣讲课程表】
开摆的只要坦诚就行了,而围观的要考虑的就很多了
嵌入式 C 语言知识点,掩码结构体
【喂到嘴边了的模块】OOPC开发从未如此简单
真刀真枪模块化(2.5)—— 君子协定
【玩转Arm-2D】旋转和缩放不够快?用脏矩阵试试
【转载】ESP32是如何运行Arm-2D的
漫画:为什么C语言永不过时?
IEEE 754 Floating NaN
明年嵌入式的趋势是啥?别道听途说,自己看!
代码对编译器优化敏感?试试MDK的缩圈定位法
如何让GUI在不同分辨率的屏幕间进行自适应
【玩转Arm-2D】入门和移植从未如此简单
【玩转Arm-2D】Arm-2D应用开发入门
【玩转Arm-2D】零基础Arm-2D API绘图入门无忧
【玩转Arm-2D】还在手算坐标?试试Layout Assistant吧!
如何让GUI在不同分辨率的屏幕间进行自适应
【玩转Arm-2D】入门和移植从未如此简单
【玩转Arm-2D】Arm-2D应用开发入门
【玩转Arm-2D】零基础Arm-2D API绘图入门无忧
【玩转Arm-2D】还在手算坐标?试试Layout Assistant吧!
【玩转Arm-2D】如何使用脏矩阵优化帧率(基础篇)
【玩转Arm-2D】十一、酷炫汽车仪表盘是怎么实现的
【喂到嘴边了的模块】LVGL9发布稳定性更新
【实战Arm-2D】如何实现任意弧度的圆环进度条
Arm-2D新版本v1.1.5发布,开放技术交流群
【玩转Arm-2D】入门和移植从未如此简单
【玩转Arm-2D】Arm-2D应用开发入门
【玩转Arm-2D】零基础Arm-2D API绘图入门无忧
群友看傻了!三个简单步骤我就把LCD刷新率逼到了理论极限
震惊!这个隐藏的Bootloader漏洞究竟有多少人中招?
【科技与狠活er】存储器用量可视化?MDK也可以
【震惊】“贫穷”的MCU中居然可以定制UTF8编码的TTF小字库?
用KEIL做自动化脚本?你疯了!
夏日炎炎,加班苦闷,遭遇瓶颈……理工男孩怎么办?
【为宏正名】99%人都不知道的"##"里用法
分类
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
原创标签
时事
社会
财经
军事
教育
体育
科技
汽车
科学
房产
搞笑
综艺
明星
音乐
动漫
游戏
时尚
健康
旅游
美食
生活
摄影
宠物
职场
育儿
情感
小说
曲艺
文化
历史
三农
文学
娱乐
电影
视频
图片
新闻
宗教
电视剧
纪录片
广告创意
壁纸头像
心灵鸡汤
星座命理
教育培训
艺术文化
金融财经
健康医疗
美妆时尚
餐饮美食
母婴育儿
社会新闻
工业农业
时事政治
星座占卜
幽默笑话
独立短篇
连载作品
文化历史
科技互联网
发布位置
广东
北京
山东
江苏
河南
浙江
山西
福建
河北
上海
四川
陕西
湖南
安徽
湖北
内蒙古
江西
云南
广西
甘肃
辽宁
黑龙江
贵州
新疆
重庆
吉林
天津
海南
青海
宁夏
西藏
香港
澳门
台湾
美国
加拿大
澳大利亚
日本
新加坡
英国
西班牙
新西兰
韩国
泰国
法国
德国
意大利
缅甸
菲律宾
马来西亚
越南
荷兰
柬埔寨
俄罗斯
巴西
智利
卢森堡
芬兰
瑞典
比利时
瑞士
土耳其
斐济
挪威
朝鲜
尼日利亚
阿根廷
匈牙利
爱尔兰
印度
老挝
葡萄牙
乌克兰
印度尼西亚
哈萨克斯坦
塔吉克斯坦
希腊
南非
蒙古
奥地利
肯尼亚
加纳
丹麦
津巴布韦
埃及
坦桑尼亚
捷克
阿联酋
安哥拉