分享: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条回答
wangpengcheng
1楼-- · 2020-02-28 23:31
lyl2022 发表于 2014-9-2 16:43
模块化编程很重要,能写出清晰明了的程序。

呵呵,像VC里面集成很多类,你甚至不需要去看他们的源码,能用就行!
wangpengcheng
2楼-- · 2020-02-29 02:20
 精彩回答 2  元偷偷看……
wangpengcheng
3楼-- · 2020-02-29 06:10
湛泸骏驰 发表于 2014-9-2 16:32
楼主说的两个GSM模块功能,那段 假设A B 两个模块吧。 作为当前模块的共用参数的保存。  这段是不是可以这 ...

对的,每个模块你都需要做一个初始化函数,可以在初始化函数中做这件事情,返回的是一个数据指针!看看PE里面就是这么做的!
wangpengcheng
4楼-- · 2020-02-29 11:41
mypear 发表于 2014-9-2 16:28
举个栗子说说

例子没有,欢迎讨论!呵呵!
wangpengcheng
5楼-- · 2020-02-29 16:43
cn_x 发表于 2014-9-2 16:27
蛮好的啊,屏幕大,电池续航时间久

有钱人!
湛泸骏驰
6楼-- · 2020-02-29 16:52
pcwinner 发表于 2014-9-2 17:57
你看看现在STM32就知道了!!出了库后,会STM32的人工资不升反跌了!

哈哈。。。。。看场合吧哈、

一周热门 更多>