模块化编程向来不是面向对象语言的专利,即使是C语言,为了降低文件、模块间的耦合度,依然要注意对变量、函数进行封装。
以下举例对C语言模块化编程进行浅析:项目中包含a.c和b.c文件,其中a.c中定义了变量/结构体,而b.c中需要用到这些变量/结构体,那么有如下几种方法可选:

  1. get/set封装
    在a.c种为每个需要被外部引用的变量/结构体编写get/set函数,并在a.h中声明get/set函数,b.c include a.h,需要使用变量/结构体的值时调用get函数,需要设置变量/结构体时调用set函数:
//a.c
static int intA;
static struct structType structData;int getA()
{return intA;
}void setA(int a)
{intA = a;return;
}struct structType getStructData()
{return structData;
}
void setStructData(struct structType data)
{structData = data;return;
}
//a.h
struct structType{int c1;
int c2;
};int getA();
void setA(int a);
struct structType getStructData();
void setStructData(struct structType data);
//b.c
#include "a.h"void funcB()
{int tmpA = getA();tmpA += 1;setA(tmpA);struct structType structTmp = getStructData();structTmp.c1 = 0;setStructData(structTmp);return;
}

写起来比较繁琐,但是是规规矩矩的封装。

  1. get进阶封装
    get/set封装使用时需要先get到变量值,加以修改后再set回去,相比之下,获取变量的地址之后直接进行修改要更方便些,写法如下:
//a.c
static int intA;
static struct structType structData;int *getPA()
{return &intA;
}struct structType *getPStructData()
{return &structData;
}
//a.h
struct structType{int c1;
int c2;
};int *getPA();
struct structType *getPStructData();
//b.c
#include "a.h"void funcB()
{int *tmpA = getPA();(*tmpA) += 1;struct structType *structTmp = getPStructData();structTmp->c1 = 0;return;
}

缺点是指针操作易发生段错误。

  1. 如果“b.c和a.c联系十分紧密,以至于b.c中用到的intA变量和a.c中用到的一样频繁”,这时也可以在get/set封装的基础上,在b.c中extern int intA;从而可以在b.c中直接使用intA,其他文件使用intA时借助get/set封装。而为了能让b.c extern,a.c中的intA就不能再加static,也就失去了get/set封装的意义,这是十分矛盾也是十分奇怪的写法。归根结底,“b.c和a.c联系十分紧密,以至于b.c中用到的intA变量和a.c中用到的一样频繁”这种情况是不应该出现的,如果两个文件联系紧密,那么该想想这两个文件是不是该合并成一个,或者把两者关于intA的操作提取出来单独存放。
    模块化编程成功的前提是对模块有好的拆分,没有好的拆分,封装的工作将变得十分棘手。

C语言模块化编程样例相关推荐

  1. json stm8s103 解析_STM8 C语言精品编程100例 PDF 超清版

    给大家带来的一篇关于C语言相关的电子文档资源,介绍了关于STM8.C语言方面的内容,本书是由STM8官网出版,格式为PDF,资源大小9.58 MB,赵荣轩编写,目前豆瓣.亚马逊.当当.京东等电子书综合 ...

  2. keil c语言模块化编程,keil C模块化编程总结

    昨晚看了下模块化编程的东西,把自己的工程整了整,可惜没成功.今早发神经似的起床敲代码,很快就发现了错误,原来是条件宏定义的头文件名忘改了,汗!!! 整理下模块化编程的要点,感谢以下三位UP主的帖子: ...

  3. C语言模块化编程的例子

    以往写C语言程序都是一个文件里面写个几十.几百行,在练算法的时候还可以,现在搞开发需要模块化编程,所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一 ...

  4. 单片机c语言模块化实例程序设计,单片机C语言模块化编程方法

    当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干.你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程.比如你可能只是负责通讯或者显示这一块.这个时候,你就应 ...

  5. c语言程序报告样例,C语言个人实习报告定稿(样例3)

    <C语言个人实习报告.doc>由会员分享,可免费在线阅读全文,更多与<C语言个人实习报告[定稿]>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索. 1 ...

  6. 语言趣味编程100例无水印_趣味c语言编程100例(三)

    经典c程序100例==51--60 [程序51] 题目:学习使用按位与 & . 1.程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1 2.程序源代 ...

  7. Mr.J--C语言经典编程100例

    C语言,一般为初学者的首选语言,说简单也简单,但是要真正学好C语言,也是一件很难的事,懂了这些100个例题,也就算是入门了吧,毕竟语言要学的太多,这只是基础. [程序1] 题目:古典问题:有一对兔子, ...

  8. 程序自我保护 c语言编程,C语言时尚编程百例

    第一篇  基础 实例1  字符串输出 实例2  格式化输出 实例3  格式化输入输出 实例4  各数值类型在内存中所占字节数 实例5  如何使用递增操作符 实例6  使用算术运算符的计算器 实例7   ...

  9. c语言模块化编程extern的用法,关于模块化编程extern用法

    单片机模块化 用C语言编写程序的时候,我们经常会遇到这样一种情况:希望在头文件中定义一个全局变量,然后包含到两个不同的c文件中,希望这个全局变量能在两个文件中共用. 举例说明:项目文件夹project ...

最新文章

  1. centos 7手动更改源
  2. graphic头文件函数_graphics.h头文件详解
  3. 全国大学生智能汽车竞赛-讯飞赛道规则解读
  4. 迫于项目压力研究果园
  5. 网站地图能给网站的优化带来什么好处
  6. Servlet学习笔记心得(二)
  7. C#通过SMTP发送邮件代码示例
  8. 未能捍卫科学家的奇思狂想,这家公司与3000亿美元失之交臂
  9. python爬虫高级知识点_Python爬虫知识点梳理总结,殿堂级小白入门必读
  10. linux disk 清除数据,如何在Linux中使用TestDisk恢复已删除的文件
  11. weblogic启动项目失败查看_weblogic启动报错常见错误解决办法
  12. Lucene的分析过程
  13. 网易2012校园招聘笔试题目
  14. 吴翰清(道哥):我对计算的理解
  15. 比例尺和分辨率的相关概念
  16. easywechat微信开发系列(2):公众号网页支付
  17. 同学们上课,今天我们学习:UI 操作一定要在 UI 线程吗?
  18. Linux内核中内存分配函数
  19. 渗透工具-fscan内网安全漏洞扫描
  20. 2023年直播行业的困境是什么?未来有哪些发展趋势?

热门文章

  1. spyder tensorflow-GPU配置
  2. 中达优控触摸屏编程视频教程_触摸屏组态编程软件|中达优控触摸屏编程软件(YKBuilder)1.0 官方版_ - 极光下载站...
  3. win10 CPU占用率过高 经常100%
  4. Golden Software Surfer 18中文版
  5. 计算机系统如何恢复出厂设置路由器,路由器怎么恢复出厂设置
  6. 关于举办第二届中国工业互联网大赛的通知——500万奖金池
  7. matlab背景图片上plot绘制图形
  8. 数据库整理-数据库特点
  9. 视频转换专家 Xilisoft Video Converter使用简介
  10. PCB阻焊层太近了会不会有问题?