嵌入式 模块划分程序设计注意事项
2015-12-31 09:47
197 查看
C语言模块化程序设计需理解如下概念:
(1) 模块即是一个.c文件和一个.h文件的结合, 头文件(.h)中是对于该模块接口的声明;
(2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字
声明;
(3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
(4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存
分配的操作, 是汇编阶段的概念; 而声明则只是告诉包含该声明的模块在连接阶段从其它模
块寻找外部函数和变量。如:
/*module1.h*/
int a = 5; /* 在模块 1 的.h文件中定义int a */
/*module1 .c*/
# include "module1.h" /* 在模块 1 中包含模块 1 的.h文件 */
/*module2 .c*/
#include "module1.h" /* 在模块 2 中包含模块 1 的.h文件 */
/*module3 .c*/
#include "module1.h" /* 在模块 3 中包含模块 1 的.h文件 */
以上程序的结果是在模块 1、2、3 中都定义了整型变量 a,a 在不同的模块中对应不同
的地址单元,这个世界上从来不需要这样的程序。正确的做法是:
/*module1.h*/
extern int a; /* 在模块 1 的.h 文件中声明 int a */
/*module1 .c*/
#include "module1.h" /* 在模块 1 中包含模块 1 的.h 文件 */
int a = 5; /* 在模块 1 的.c 文件中定义 int a */
/*module2 .c*/
#include "module1.h" /* 在模块 2 中包含模块 1 的.h 文件 */
/*module3 .c*/
#include "module1.h" /* 在模块 3 中包含模块 1 的.h 文件 */
这样如果模块 1、2、3 操作a的话,对应的是同一片内存单元。
(1) 模块即是一个.c文件和一个.h文件的结合, 头文件(.h)中是对于该模块接口的声明;
(2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字
声明;
(3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
(4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存
分配的操作, 是汇编阶段的概念; 而声明则只是告诉包含该声明的模块在连接阶段从其它模
块寻找外部函数和变量。如:
/*module1.h*/
int a = 5; /* 在模块 1 的.h文件中定义int a */
/*module1 .c*/
# include "module1.h" /* 在模块 1 中包含模块 1 的.h文件 */
/*module2 .c*/
#include "module1.h" /* 在模块 2 中包含模块 1 的.h文件 */
/*module3 .c*/
#include "module1.h" /* 在模块 3 中包含模块 1 的.h文件 */
以上程序的结果是在模块 1、2、3 中都定义了整型变量 a,a 在不同的模块中对应不同
的地址单元,这个世界上从来不需要这样的程序。正确的做法是:
/*module1.h*/
extern int a; /* 在模块 1 的.h 文件中声明 int a */
/*module1 .c*/
#include "module1.h" /* 在模块 1 中包含模块 1 的.h 文件 */
int a = 5; /* 在模块 1 的.c 文件中定义 int a */
/*module2 .c*/
#include "module1.h" /* 在模块 2 中包含模块 1 的.h 文件 */
/*module3 .c*/
#include "module1.h" /* 在模块 3 中包含模块 1 的.h 文件 */
这样如果模块 1、2、3 操作a的话,对应的是同一片内存单元。
相关文章推荐
- Selenium & Webdriver 远程测试和多线程并发测试
- 《AngularJS深度剖析与最佳实践》简介
- Linux环境下安装部署AWStats日志分析系统
- iOS9--画中画(Picture In Picture)使用及案例
- 我的软件开发之路第二章
- 点击按钮动态的显示适当的文本
- Chapter 1 Securing Your Server and Network(12):保护链接server
- 转 如何用mt7620方案的rt2860v2驱动实现wifi探针功能,网上能搜到一些方法,但是讲的好模糊?
- 支付与推送
- Python网络爬虫小试刀——抓取ZOL桌面壁纸图片4
- java获取ip地址和Mac地址
- Visual Studio 2008 C++ 内存泄露检测
- FindBugs
- android 开发工具
- 去掉友盟分享里面不需要的平台
- JMS解决系统间通信问题
- 史上最全的测试团队组建方法
- 我开发 wangEditor-mobile 的故事
- ListView嵌套GridView的一些处理(点击GridView的条目,能够显示他在ListView中的位置)
- 注解测试类