当前位置:首页 > > strongerHuang
[导读]关注星标公众号,不错过精彩内容来源|嵌入式大杂烩今天给大家分享一篇关于数据抽象的小短文:在往期文章:什么是不完全类型?中,我们清楚地知道了数据抽象的好处。这一篇再一起来看一个简单的小技巧。实际项目中,常常会有多个模块协同工作,各个模块之间会相互调用。两种声明方法:一种是在把对外提...


关注 星标公众,不错过精彩内容

来源 | 嵌入式大杂烩


今天给大家分享一篇关于数据抽象的小短文:

在往期文章:什么是不完全类型?中,我们清楚地知道了数据抽象的好处。

这一篇再一起来看一个简单的小技巧。

实际项目中,常常会有多个模块协同工作,各个模块之间会相互调用。

两种声明方法:

一种是在把对外提供的接口在本模块头文件中声明,其它模块需要调用时包含这个头文件就可以。另一种是调用者在调用之前使用extern进行声明。

我比较倾向于第一种方法,严格把只在本模块文件中使用的函数使用static声明,供外部使用的函数在头文件里声明,调用者直接包含头文件就可以调用。而不用自己使用extern进行声明,extern的方法我常常会临时使用一下。

特别的,有时候需要把本模块编译为动态库给他人使用,这时候更是要多花功夫在头文件上,把供外部使用的函数放在头文件中。因为最终提供的是动态库文件与头文件,别人看不到你的源码。

下面我们先简单看看数据抽象的概念:

「数据抽象」是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。一个简单的C 例子如:

「test.cpp:」

#include 

using namespace std;
 
class test
{

   public:
      // 构造函数
      test(int x = 0)
      {
        a = x;
      }
      // 对外的接口
      void set_a(int x)
      
{
          a = x;
      }
      // 对外的接口
      int get_a()
      
{
          return a;
      };
   private:
      // 对外隐藏的数据
      int a;
};

int main(void)
{
   test a;
   
   a.set_a(100);
   cout << "a = " << a.get_a() << endl;
   return 0;
}
在C语言中,上面我们提到了使用extern的方法声明函数。同样的,对于全局变量,也有使用extern的方法来声明。如:

「a.c:」

int a = 0;
「b.c:」

extern int a;
int b = a;
a = 100;
我们在a.c中定义了一个全局变量a,在b.c中使用变量a之前前,先用extern对a进行声明。

对于这个小例子,有更好的方法,即面向对象数据抽象的思想:

「a.c:」

int a = 0;
int get_a(void)
{
 return a;
}

void set_a(int x)
{
 a = x;
}
「a.h:」

int get_a(void);
void set_a(int x);
「b.c:」

int b = get_a();
set_a(100);
这样我们在b.c中就不用直接操作变量a,而是通过a提供的函数接口来操作。这样,b模块作为调用者,只要遵守了a模块要求调用的函数,哪怕后续a模块里面的内容有修改时,b模块可以不用修改就可以正常使用。这个小例子只是简单介绍了这种小技巧。

在实际项目中的使用场景可能是这样的:假设a模块是对传感器的处理,b模块是传感器数据使用者,后面换相同类型传感器的时候,a模块负责进行适配,b模块作为调用者,不用担心换传感器而需要做大改动。

------------ END ------------

后台回复『嵌入式软件设计与开发』阅读更多相关文章。


欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。嵌入式软硬件、物联网、人工智能、AIoT、半导体、单片机、开发工具、编程技术、行业资讯等相关内容(关注并回复“1024”查看更多精彩内容)。" data-from="0">欢迎关注我的视频号:


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

PSOC™ Edge E84 AI 开发套件是一款用于嵌入式和边缘人工智能应用的开发板。本指南将说明如何配置 Arduino IDE 以支持 PSOC™ Edge E84 AI 开发套件,并提供在该开发板上编译、上传和运...

关键字: 嵌入式 边缘人工智能 Arduino

Agentic AI 正在生成比以往更多的模型、代码、需求以及测试工件,但更多的产出并不意味着更快的系统级开发进展。这种脱节源于系统连续性的中断:每次工具之间的交接都会丢失可执行的系统状态,迫使工程师在继续工作之前,从静...

关键字: 电动汽车 Agentic AI 嵌入式

本项目将一块STM32板改造为一个简单的音频设备,通过三个按钮进行控制。按下其中一个按钮可播放音调,另外两个按钮则用于通过扬声器调节频率的上下变化。该项目探索了嵌入式编程的基础知识,包括GPIO配置、方波生成以及实时响应...

关键字: 扬声器 嵌入式 方波 STM32

树莓派Pico 2是树莓派推出的最新微控制器开发板,搭载强大的RP2350微控制器。它提供更快的性能、更大的内存、增强的安全性,并支持Arm Cortex-M33和Hazard3 RISC-V两种架构。

关键字: 嵌入式 MicroPython 树莓派 RP2350

语音控制在消费电子产品中已十分常见,但将其集成到嵌入式项目中却仍然令人意外地困难。大多数解决方案依赖云服务、需要大量编程,或仅限于固定的一组预设命令。对于创客、学生和业余爱好者而言,将离线语音识别功能融入ESP32项目可...

关键字: 消费电子 嵌入式 ESP32-S3

在后端服务、嵌入式系统的长期运行过程中,多线程死锁是最让人头疼的疑难问题之一。很多时候程序没有任何崩溃迹象,CPU占用率也很低,日志输出突然完全停滞,所有业务请求全部卡死,进程就像进入了永久休眠状态。不少开发者遇到这类问...

关键字: GDB 嵌入式

康佳特基于 AMD 锐龙 AI 嵌入式 X100 系列处理器的COM-HPC Client conga-HPC/cRX1模块 树立性能新标杆

关键字: AI 嵌入式 处理器

在嵌入式开发、硬件调试和芯片测试的世界里,JTAG是一个无处不在却又常常被开发者一知半解的核心存在。很多工程师天天用JTAG下载程序、调试芯片,却未必能说清它的本质,遇到下载失败、连接中断的问题时,只会盲目更换仿真器,找...

关键字: JTAG 嵌入式

AI编程助手已经彻底改变了一名开发者一个上午能完成的工作量。过去需要几个小时才能理清思路、写出草稿的代码,现在几秒钟就能生成。对于探索性工作和快速原型开发来说,这种效率提升是实实在在的。

关键字: AI编程助手 代码 嵌入式

很多嵌入式开发者调试IIC通信时,都遇到过这类看似无解的问题:代码逻辑完全符合数据手册要求,示波器抓波形也看不出明显异常,但总线就是随机丢包、传感器偶尔返回乱码,甚至完全无法通信。排查到最后才发现,要么是GPIO配置成了...

关键字: 嵌入式 上拉电阻
关闭