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
    +关注

    关注

    146

    文章

    16717

    浏览量

    348470
  • 接口
    +关注

    关注

    33

    文章

    8293

    浏览量

    150205
  • C语言
    +关注

    关注

    180

    文章

    7575

    浏览量

    134857
收藏 人收藏

    评论

    相关推荐

    typedef和struct区别

    在C语言中, typedef 和 struct 是两个非常重要的关键字,它们在定义数据结构时扮演着关键的角色。然而,它们之间一些明显的区别。 1. struct 关键字 struct (结构
    的头像 发表于 08-20 11:00 486次阅读

    请问esp-idf&vscode结构索引不到对应的成员如何解决?

    兄弟们,我用VSCode 初始化结构时,索引不到对应的成员,并且索引会出现不属于结构体内的东西,有解决办法吗,球球了
    发表于 06-14 06:42

    你是否真的了解结构占用了多少字节?

    结构成员所占内存空间大小一般情况下,如果想知道结构成员的内存占用情况需要:1、先用
    的头像 发表于 06-04 08:04 269次阅读
    你是否真的了解<b class='flag-5'>结构</b><b class='flag-5'>体</b>占用了多少字节?

    嵌入式中C语言结构基本实现

    :     在struct 中声明了一个含有若干新成员的数据类型。     tag  是结构标签。     member-list  是标准的变量定义,比如 int i; 或者 float f,或者其他
    的头像 发表于 05-11 08:49 813次阅读
    嵌入式中C语言<b class='flag-5'>结构</b><b class='flag-5'>体</b>基本实现

    经典 C 语言编程,结构和联合体如何共用?

    可以 使用 sizeof 进行获取,默认为字节对齐的大小。 联合体 联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存共享等。 结构和联合体连用例子: 1、首先定义一个
    的头像 发表于 01-11 18:24 1126次阅读
    经典 C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    结构与指针的关系

    在C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构结构
    的头像 发表于 01-11 08:00 826次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的关系

    golang结构如何定义?如何使用

    结构是go语言最重要的数据结构之一,go和其它编程语言不一样,它没有类的概念,类比过来struct就相当于其它语言中的类,因此十分重要。
    的头像 发表于 11-28 10:36 355次阅读

    C语言结构(struct)用法详解

    在实际的开发过程中,一组数据往往具有不同的数据类型,此时数组是不能够满足需求了。因为数组中各元素的类型必须是一致的。为了解决这个需求,C中给出了另一种数据类型-结构,每一个成员可以
    的头像 发表于 11-15 16:11 1620次阅读
    C语言<b class='flag-5'>结构</b><b class='flag-5'>体</b>(struct)用法详解

    为什么我定义的结构不能用--&gt;来调用结构的元素?

    结构代码部分 typedef unsigned int uint_32t; typedef unsigned short uint_16t; typedef struct { uint_32t
    发表于 11-11 19:06

    求助,结构变量定义引用问题求解

    |= mask; } 如以上语句,GPIO_Type是个结构定义,定义了一个*base变量,在引用其中的成员时,是base->IMR的方式。这怎么理解; 如果是
    发表于 10-27 06:06

    FAQ0066结构成员未完全初始化导致程序异常的解决方法

    使用非官方程序,由于某些外设驱动在配置结构时,未完全初始化所有成员,导致程序运行异常。以 FSMC 为例,FSMC_NORSRAMInitStructure 结构
    发表于 10-20 06:59

    如何在DEBUG的时候实时观察SYSTICK结构的数据?

    的VAL,CTRL不停赋值给temp,然后通过观察temp来确定结构中的数据。这种间接观察数据的方式非常麻烦,而且对于CTRL很不友好。 请问,对于SysTick这种结构指针,怎么添加到Watch中,
    发表于 10-18 06:29

    linux系统中三个关键结构

    struct inode结构和struct file结构 都是用来描述文件信息的,struct inode结构
    发表于 10-15 11:04 288次阅读

    结构struct和联合体union的区别

    结构struct和联合体union的区别
    发表于 10-11 08:21

    C语言中的结构指针在访问的时候怎么读取成员变量的数据?

    C语言中的结构指针在访问的时候怎么读取成员变量的数据
    发表于 10-10 07:07