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;

最新文章

  1. clr 元数据
  2. js实现光标位置置后
  3. hibernate HQL和Criteria
  4. JAVA利用Zip4j解压缩【转】
  5. [Leetcode][JAVA] Binary Tree Maximum Path Sum
  6. struts (二)
  7. sshd_config配置 详解
  8. 【转】如何调整CHM文件中的字体!非常有爱!
  9. excel导入数据到sqlserver
  10. codeforces 678D D. Iterated Linear Function(水题)
  11. PHP中的ob_start() 的使用
  12. 惠普 hpssacli 工具使用
  13. R语言面向对象编程:S3和R6
  14. Apache设置二级域名和虚拟主机
  15. Shiro的原理及Web搭建
  16. 19南昌网络赛L
  17. D2. Great Vova Wall (Version 2)
  18. html总结:float实现span和input输入框同行
  19. MySQL数据类型--与MySQL零距离接触 3-2 外键约束的要求解析
  20. rsyslog local0-local7的用法

热门文章

  1. 三十五:数据库之SQLAlchemy外建之一对多关系
  2. gcc编译器创建和使用静态库、动态库
  3. 未能加载文件或程序集“microsoft.Build.Engine, Version=3.5.0.0,...”或它的摸一个依赖项。
  4. HDU 1042 N!(高精度阶乘、大数乘法)
  5. 【转贴】Linux查看物理CPU个数、核数、逻辑CPU个数
  6. Hive Error : Java heap space 解决方案
  7. mysql 表相关操作(1)
  8. python面向对象中的封装、继承、多态
  9. 解决IOS把数字渲染为电话号码,颜色为蓝色解决方案
  10. Linux等操作系统杂谈