C语言作为一种结构化的程序设计语言,在模块的划分上主要依据的是功能(依功能进行划分在面向对象设计中成为一个错误);
模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;
某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;
模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现!
char * function(void)
{ char *p;
p = (char *)malloc(…);
if(p==NULL) …;
… /* 一系列针对p的操作 */
return p;
}
在某处调用function(),用完function中动态申请的内存后将其free
char *q = function();
…
free(q);
上述代码明显是不合理的,因为违反了malloc和free成对出现的原则,即“谁申请,就由谁释放”原则。不满足这个原则,会导致代码的耦合度增大,因为用户在调用function函数时需要知道其内部细节!
正确的做法是在调用处申请内存,并传入function函数:
char *p = malloc(…);
if (p == NULL)
…;
function(p);
…
free(p);
p = NULL;
在嵌入式开发中,有时候全局数组比在堆栈上的局部变量缓冲区更高效,在嵌入式式开发中,往往目标板上的资源是有限的,如有的系统中规定调用函数不能超过8级(在C51编译下),这样就规定了堆栈指针SP不能太高,如果堆栈指针过高,程序会出现不可预知的结果, 使用全局变量,避免了调用函数时的拷贝,压栈出栈操作,这就是为什么在嵌入式开发中经常看到全局变量的原因,而以前我们要求避免使用全局变量。