当前位置: 首页 > news >正文

成都网站设计制作公司/百度发布信息的免费平台

成都网站设计制作公司,百度发布信息的免费平台,网站建设公司哪家好 该如何选择,梧州网页设计师招聘正文大家好,我是bug菌!最近挺忙的,在上周直播中也跟大家提到,今年做的几个新项目也都接近尾声,与此同时开始对各个地区的老客户进行需求采集和未来项目规划。所以今天能够看到bug菌的这篇原创文章,应该是幸…

3792fabe56faa22992768b346209f2f0.gif

正文


大家好,我是bug菌!

最近挺忙的,在上周直播中也跟大家提到,今年做的几个新项目也都接近尾声,与此同时开始对各个地区的老客户进行需求采集和未来项目规划。所以今天能够看到bug菌的这篇原创文章,应该是幸福感满满的。

当然马上中秋小长假了,祝大家中秋节快乐~

今天的主题算是之前文章的拓展,如下:

☞ 如何隐藏"结构体对象"成员?

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

1

原理与技巧

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

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

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

参考代码:

/************filename: App.c*************/ typedef struct _tag_StObj stObj;
struct _tag_StObj
{int member1;int member2;
};/********************************** * Function :  sCreate* Note :创建对象* Author: bug菌**********************************/ 
stObj * sCreate(int member1,int member2)
{static  stObj staticObj;staticObj.member1 = member1;staticObj.member2 = member2;return &staticObj;
}/********************************** * Function :  sAdd* Note :对象方法* Author: bug菌**********************************/ 
int sAdd(stObj *pObj)
{return (pObj->member1 + pObj->member2);
}
/************filename: App.h*************/ 
#ifndef __APP_H__
#define __APP_H__//自定义结构体声明
typedef struct _tag_StObj stObj;
struct _tag_StObj
{int member1;
};//extern interface
extern stObj * sCreate(int member1,int member2);
extern int sAdd(stObj *pObj); #endif
/**********main.c file***********/
#include <stdio.h>
#include "App.h"int main(void)
{stObj *Obj;Obj = sCreate(3,5); //内部构造结构体 printf("member1 = %d\n",Obj->member1);  //调用OK,member1被公开//printf("member2 = %d\n",Obj->member2); 调用失败,因为member2被隐藏printf("result = %d\n",sAdd(Obj));  //调用相应的接口 return 0;
}

输出结果:

513f286f34bc1b4e2d837d96075354a2.png

从输出结果上来看编译正常,且输出了正确的结果,member1可被外界直接访问,而member2只能通过App.c内部直接访问,或者通过定义外部函数接口进行间接访问,否则就会报错。

一顿猛如虎的操作竟然验证了自己的一些想法。

2

优化版本

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

参考代码:

/************filename: App.h*************/ 
#ifndef __APP_H__
#define __APP_H__typedef struct _tag_Stpublic stpublicObj;
struct _tag_Stpublic
{int member1;int member2;
};typedef struct _tag_StObj stObj;
struct _tag_StObj
{stpublicObj public;
};//interface
extern stObj * sCreate(int member1,int member2);
extern int sAddprivate(stObj *pObj); 
extern int sAddpublic(stObj *pObj);#endif
/************filename: App.c*************/ 
//#include "App.h"typedef struct _tag_Stpublic stpublicObj;
struct _tag_Stpublic
{int member1;int member2;
};typedef struct _tag_Stprivate stprivateObj;
struct _tag_Stprivate
{int member1;int member2;
};typedef struct _tag_StObj stObj;
struct _tag_StObj
{stpublicObj public;stprivateObj private;
};/********************************** * Function :  sCreate* Note :创建对象* Author: bug菌**********************************/ 
stObj * sCreate(int member1,int member2)
{static  stObj staticObj;staticObj.private.member1 = member1;staticObj.private.member2 = member2;return &staticObj;
}/********************************** * Function :  sAdd* Note :对象方法* Author: bug菌**********************************/ 
int sAddprivate(stObj *pObj)
{return (pObj->private.member1 + pObj->private.member2);
}/********************************** * Function :  sAdd* Note :对象方法* Author: bug菌**********************************/ 
int sAddpublic(stObj *pObj)
{return (pObj->public.member1 + pObj->public.member2);
}
/**************main.c file****************/
#include <stdio.h>
#include "App.h"int main(void)
{stObj *Obj;Obj = sCreate(3,5); //内部构造结构体 Obj->public.member1 = 10;Obj->public.member1 = 6;Obj->public.member2 = 10;printf("member1 = %d\n",Obj->public.member1);  //调用OK,member1被公开printf("member2 = %d\n",Obj->public.member2);  //调用OK,member1被公开//    printf("member1 = %d\n",Obj->private.member1); //调用失败,因为member1被隐藏
//    printf("member2 = %d\n",Obj->private.member2);  //调用失败,因为member2被隐藏printf("private result = %d\n",sAddprivate(Obj));  //调用相应的接口 printf("public result = %d\n",sAddpublic(Obj));  //调用相应的接口 return 0;
}

输出结果:

e17390393d1777ed9fdfa34499072e86.png

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

最后

      好了,本来回得比较晚,这不一眨眼的功夫凌晨了,如果你觉得有所收获,一定记得点个~

      中秋小长假就不更新了,大家可以回味一下bug菌之前的文章~

15873a8bfd3d4bef1ace21567609da6f.png

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 2e5233100829fc019f4b4bb1cc1519b1.gif

☞  嵌入式C语言进阶专辑 b670699feaf2f4c96b1cdd7590b6a661.gif

☞  “bug说”专辑 bab29dea0e8db1bd26787e8bd03c5996.gif

65388508c44f38bbc587b899f015d16c.gif

http://www.lbrq.cn/news/1308097.html

相关文章:

  • 青海网站建设哪家强/网络营销的十大特点
  • 广州网站设计联系方式/企业软文营销发布平台
  • 同一个域名两个网站/淘宝关键词推广
  • asp 网站图标/整站seo排名外包
  • 教育在线网站怎样做直播/google app
  • 做一个网站需要多少时间/优化外包服务公司
  • 电商小程序需要什么资质/杭州seo关键字优化
  • 网站后台 设计/seo顾问服务 品达优化
  • 站长工具官方网/手机如何创建网站
  • 外贸做网站的好处/seo优化工作有哪些
  • 正能量网站推荐免费下载/宣传产品的方式
  • 1 企业网站的一般内容是什么/青岛seo推广
  • 网站建设公司杭州/营销推广是什么
  • 隆尧建设局网站/宁波网站seo哪家好
  • 建设执业资格注册中心官方网站/广告公司招聘
  • 墨玉县建设工程信息网/深圳seo关键词优化外包公司
  • wordpress搬家插件/上海公司网站seo
  • 微信获客crm平台/湖南seo推广服务
  • 制作网站详细步骤/怎么做app推广和宣传
  • 杭州商城型网站建设/今日国内新闻大事
  • 洞泾做网站/大二网络营销实训报告
  • 杭州公司网站设计/建设网站公司
  • 政府部门网站建设规定/企业排名优化公司
  • 国外怎么做直播网站吗/品牌策划推广方案
  • 建湖专业做网站的公司/外贸网站平台哪个好
  • 哈尔滨免费做网站/兰州seo网站建设
  • 在虚拟主机上建设多个网站/微信指数怎么看
  • 找人做网站昆明/站长统计app进入网址新版小猪
  • 网站没备案可以做淘宝客吗/外包公司为什么没人去
  • phpcms仿站教程/河北网站建设制作
  • 深入解析Hadoop:机架感知算法与数据放置策略
  • Liunx练习项目6-创建dns服务器
  • 【人工智能99问】神经网络的工作原理是什么?(4/99)
  • sqli-labs靶场通关笔记:第18-19关 HTTP头部注入
  • wpf Canvas 动态增加右键菜单
  • spring-ai-alibaba官方 Playground 示例之联网搜索代码解析