分享:C语言模块化的一点心得

2020-02-20 20:25发布

其实刚参加工作的时候,老大就告诉我们,做程序要模块化,然后一直以来对这个概念比较模糊,因为从硬件入手进入编程领域的同学,基本和我差不多,都是一点一点自己在摸索,一点一点进步。直到2010年,当时要学一点OS,在Linux里面才学到那么一点点意思!昨天浪里白条问我一个问题,所以我就想写写自己的心得出来给大家参考!

我的理解,模块化的主要意义在于模块分离。有一种情况是移植,比如说我做了一个模块,可能要在不同的程序中应用,但是在此模块中可能会调用别的模块的变量、函数、参数等等,这样的话用的时候就需要对模块进行工作量大小不一的修改。那么有什么好办法可以不用修改模块呢?在这里,我用指针,用指针的好处是可以将模块与其它模块完全脱离,像上次老白说的,说GSM模块中有调用UART模块中的函数。这种情况就是在GSM模块中定义一个函数指针,然后在初始化的时候将UART模块中的函数赋值给它,这就造成一个假像,此函数属于GSM模块了,用的时候调用的是GSM模块本身的变量。这样的好处是下次GSM模块需要调用SPI模块同样功能的函数,那么我只要在初始化的时候将SPI模块的该函数赋值给GSM模块的函数指针就可以了。为了防止该指针在没有被赋值的情况下被调用,我们在调用之前需要先判断一下该指针是否为空,这样就不会造成野指针的出现!以上是一个以函数为代表说明一下分离,其它的都差不多,比如变量什么的,都可以用指针在本模块中做一个虚拟值,就像我们做硬件模块,以前都是直接把线焊到一起的,分离的时候很麻烦,现在我用了一个插座,呵呵,那分离就简单多了,指针就是我们的插座,只要在初始化的时候把各个插座对接上,那么就可以应用了!

另外还有一种情况,在同一个程序中重复调用。我还用刚才GSM模块说明,比如现在我需要两个GSM模块功能,但是这两个可能在同一段时间内都要被调用,那么可能我在任务1中调用GSM模块的时候任务2也需要调用,所以这时候GSM模块中的一些公用参数就会产生冲突。这时候又该怎么办呢?我的做法是用结构体,我将所有公共参数都包含到一个结构体里面去,然后在该模块初始化的时候申请一块结构体大小的内存,作为当前模块的共用参数的保存。只要记住起始指针就可以了。这样我就不怕他重复调用了,程序还是原来的程序,只是两个任务调用的时候所操作的数据区完全不同了,也不会影响到别的调用!

其实这大概就是面向对像的原理!像我前几天发的一个代码生成的帖子中的那个小工具,就是基于这个原理做出来的。

例子没有,欢迎讨论!

最后祝大家工作顺利!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
ycping
1楼-- · 2020-02-27 07:50
MARKINGING
步之道
2楼-- · 2020-02-27 13:45
在基本面上要做到模块的功能实现,势必要做好模块与模块之间的独立和依赖的平衡。比如一个模块调用了另一个模块,那么着两个模块要区别出来不同层来。
电子小生
3楼-- · 2020-02-27 17:58
硬件模块化,软件模块化,走得都必是同一种路
lidreamer
4楼-- · 2020-02-27 20:45
 精彩回答 2  元偷偷看……
pcwinner
5楼-- · 2020-02-28 01:31
模块后,技术人员就不值钱了!~!!!
反对模块
pcwinner
6楼-- · 2020-02-28 05:04
你看看现在STM32就知道了!!出了库后,会STM32的人工资不升反跌了!

一周热门 更多>