0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

有什么办法可以做到私有结构体成员与公共结构体成员区别对待呢?

冬至配饺子 来源:最后一个bug 作者:bug菌 2022-08-11 14:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在文章最后提到之前的隐藏结构体成员的方法是一种完全私有的封装无法做到"公私分明",这样通过函数调用在MCU中会存在较大的开销。

1、原理与技巧

那时候bug菌就在想有什么办法可以做到私有成员与公共成员区别对待呢?

既然.h文件中的不完全类型仅仅只是一个啥也不含的结构体空壳,那么根据结构体的内存模型以及我们平时经常提到的C语言面向对象设计中的继承处理。

于是便编写了如下代码来验证我的想法:

参考代码:

poYBAGL0o9aAbQLGAAD9hCfZ5sI916.pngpoYBAGL0o92AOVYBAAB0SK8WK5A993.pngpYYBAGL0o_WASNMLAACXtOsYS8w370.png

输出结果:

poYBAGL0o_yAJFQoAABWl3kCgcw166.png

从输出结果上来看编译正常,且输出了正确的结果,member1可被外界直接访问,而member2只能通过App.c内部直接访问,或者通过定义外部函数接口进行间接访问,否则就会报错。一顿猛如虎的操作竟然验证了自己的一些想法。

2、优化版本

后来又想了想,如果成员比较多,不是特别好管理,于是尝试了一个更好的成员管理方式:

参考代码:

pYYBAGL0pDCALpEpAAC8H4wIN5o435.pngpoYBAGL0pDWARE0QAAD8jASol1E098.pngpoYBAGL0pDyAW16gAACq0UJ90uU981.pngpYYBAGL0pEOAAkJZAAD-dlmim7M607.png

输出结果:

pYYBAGL0pFyAT6D8AABXBO7RPHI405.png

编译OK,完工,是不是感觉有一股C++的味道了,如果你还没有看懂的话,记得多看几遍,因为这种处理方式算是非常常见的~



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19241

    浏览量

    405204
  • 接口
    +关注

    关注

    33

    文章

    9636

    浏览量

    157815
  • C语言
    +关注

    关注

    183

    文章

    7649

    浏览量

    146420
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    关于C语言对齐的一些总结

    1. 对齐的目的是什么? 提供访问效率---放大对齐 压缩存储空间---紧凑对齐 2. 对齐的类型哪些? 自然对齐 :结构默认按 最大基础类型成员 的大小对齐(比如最大
    的头像 发表于 05-08 11:23 445次阅读

    GLAD应用:全息光栅模拟

    。从而用于模拟全息记录介质中形成的梯度折射率分布。全息结构一旦形成,就可以在传输过程中将一束入射光波逐渐转换成形成体全息结构的另一束光波。两束光波之间的能量传递转换效率与
    发表于 04-24 08:25

    鸿蒙智能上/下架、升级流程介绍

    执行上架操作,并且已经审核通过的智能,才能被其他用户搜索并使用。 升级审核未通过的智能,线上依旧保留上一次通过审核的智能版本提供给其他用户使用。 下架后的智能,用户无法再使用。
    发表于 02-10 10:38

    请问如何从一个函数内部判断本函数是否是个成员函数还是个非成员函数?

    如何从一个函数内部判断本函数是否是个成员函数还是个非成员函数?
    发表于 01-06 06:30

    10个例子代码,C语言结构的高级

    当涉及到C语言结构的高级**时,很多有趣和强大的技巧可以应用。下面是10个例子代码,每个例子都使用了不同的高级结构
    发表于 01-05 06:32

    一个经典的结构和联合体共用的实例

    Linux 中可以 使用 sizeof 进行获取,默认为字节对齐的大小。 联合体 联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存共享等。 结构和联合体
    发表于 12-16 07:14

    结构声明与定义

    1、声明 结构的声明使用struct关键字,如果我们想要把我们的学籍信息组织一下的话,可以这样表示: struct Info { unsigned long identifier;//学号
    发表于 12-11 07:52

    typedef结构使用

    虽然结构的出现能够让我们一个更科学的数据结构来管理数据,但是每次使用结构都需要struct
    发表于 12-08 07:04

    共用声明

    共用也称联合体。 和结构还是有点像: union 共用名称 { 成员1; 成员2
    发表于 12-05 07:24

    为什么不建议用匿名结构

    : 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,它的成员
    的头像 发表于 07-16 16:26 1676次阅读

    渗压计在混凝土结构中的安装指南

    用于测量土体中的孔隙水压力、岩和混凝土内的渗透水压力。在混凝土结构中埋设渗压计,可以实时监测结构内部的水压力变化,为工程安全评估和维护提
    的头像 发表于 05-28 10:55 828次阅读
    渗压计在混凝土<b class='flag-5'>结构</b><b class='flag-5'>体</b>中的安装指南