面向对象的技术成为主流以前许多年,C语言的编程者使用C语言支持模块是的编程风格,使用这种方法,就可以即在C中创建“基于文件的类”,又不增加许多内存或CPU的负载。文件变成了我们的类,且文件中“static”数据成为该类的私有数据成员,该文件中定义的 函数成为文件类的 成员函数,并且我们的整个程序可以分成许多清晰定义的(基于文件的)类。
将一个单一文件的程序转为面向对象的C文件
规则:
1.公有“成员”函数,在.h文件中有他们的原型
2.私有“成员”函数,在C文件中有他们的原型,并加static
3.公有的常数,它的值必需要被程序中的其他部分访问,定义在.h文件中
4.少数的一些公共变量,在C文件中定义(没有使用static关键字)
5.私有常数及私有变量,他们在文件以外是“看不到的”
另外一遍文章中的内容。
模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:
(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;
(2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;
(3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
(4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:
以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这个世界上从来不需要这样的程序。正确的做法是:
这样如果模块1、2、3操作a的话,对应的是同一片内存单元。
一个嵌入式系统通常包括两类模块:
(1)硬件驱动模块,一种特定硬件对应一个模块;
(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
程序清单 基于文件的C语言类的一个例子(H文件)
来源:EDN