C语言模块化编程(封装)
- 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明。模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函数放在.h文件中。
- 对外发布的模块调用本质上是一个编译好的.so或.a或.o的二进行制文件加一个.h文件的组。
- 不要在.h文件中定义变量,如果不同的模块包含该.h文件,则在不同的模块中该变量对应不同的地址。
- 模块内的函数和模块内的全局变量需在.c 文件开头冠以static 关键字声明,一方面是限定了函数的作用范围只是在本模块中起作用,另一方面也给人传达这样的信息:该函数不会被其他模块调用。
- 函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变,赋值操作除外。
- 一个模块提供给其它模块调用的外部函数及数据需在.h 中文件中冠以extern 关键字声明。
- extern会破坏模块的封装性,不建议使用, 因此extern一般用于全局变量的声明。
extern的预处理示例:
/* in var_a.h */
#ifdef VAR_GLOBAL
#define VAR_EXT
#else
#define VAR_EXT extern
#endif
VAR_EXT int var1;
VAR_EXT int var2;
如果var_b.h包含了var_a.h且在var_b.h中有以下宏定义
#define VAR_GLOBAL
由于VAR_GLOBAL被定义为空,于是变量展开为
int var1;
int var2;
如果在var_b.h包含了var_a.h但在var_b.h中没有以上宏定义则变量展开为
extern int var1;
extern int var2;