首页
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
更多
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
嵌入式 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
裸机思维
傻孩子图书工作室。探讨嵌入式系统开发的相关思维、方法、技巧。
最新文章
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%人都不知道的"##"里用法
GNU C扩展语法归纳详解(一)
【玩转Arm-2D】为什么说“得蒙版者得GUI”
【玩转Arm-2D】零基础Arm-2D API绘图入门无忧
分类
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
原创标签
时事
社会
财经
军事
教育
体育
科技
汽车
科学
房产
搞笑
综艺
明星
音乐
动漫
游戏
时尚
健康
旅游
美食
生活
摄影
宠物
职场
育儿
情感
小说
曲艺
文化
历史
三农
文学
娱乐
电影
视频
图片
新闻
宗教
电视剧
纪录片
广告创意
壁纸头像
心灵鸡汤
星座命理
教育培训
艺术文化
金融财经
健康医疗
美妆时尚
餐饮美食
母婴育儿
社会新闻
工业农业
时事政治
星座占卜
幽默笑话
独立短篇
连载作品
文化历史
科技互联网
发布位置
广东
北京
山东
江苏
河南
浙江
山西
福建
河北
上海
四川
陕西
湖南
安徽
湖北
内蒙古
江西
云南
广西
甘肃
辽宁
黑龙江
贵州
新疆
重庆
吉林
天津
海南
青海
宁夏
西藏
香港
澳门
台湾
美国
加拿大
澳大利亚
日本
新加坡
英国
西班牙
新西兰
韩国
泰国
法国
德国
意大利
缅甸
菲律宾
马来西亚
越南
荷兰
柬埔寨
俄罗斯
巴西
智利
卢森堡
芬兰
瑞典
比利时
瑞士
土耳其
斐济
挪威
朝鲜
尼日利亚
阿根廷
匈牙利
爱尔兰
印度
老挝
葡萄牙
乌克兰
印度尼西亚
哈萨克斯坦
塔吉克斯坦
希腊
南非
蒙古
奥地利
肯尼亚
加纳
丹麦
津巴布韦
埃及
坦桑尼亚
捷克
阿联酋
安哥拉