到底如何理解“模块”

apexMing 2012-11-27 08:43:31
与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。

如何理解C/C++中模块的概念呢?
我抛砖引玉,摘录一点,希望大家多多交流。

引用
C程序采用模块化的编程思想,需合理地将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求,在模块的划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件的正确使用方法是:
规则1 头文件(.h)中是对于该模块接口的声明,接口包括该模块提供给其它模块调用的外部函数及外部全局变量,对这些变量和函数都需在.h中文件中冠以extern关键字声明;

规则2 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

规则3 永远不要在.h文件中定义变量;

/*模块1头文件:module1.h*/
extern int a; /* 在模块1的.h文件中声明int a */
/*模块1实现文件:module1 .c*/
#include “module1.h” /* 在模块1中包含模块1的.h文件 */
int a = 5; /* 在模块1的.c文件中定义int a */
/*模块2 实现文件: module2 .c*/
#include “module1.h” /* 在模块2中包含模块1的.h文件 */
/*模块3 实现文件: module3 .c*/
#include “module1.h” /* 在模块3中包含模块1的.h文件 */

规则4 如果要用其它模块定义的变量和函数,直接包含其头文件即可。
...全文
109 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
引用 4 楼 yisikaipu 的回复:
当 a.obj 和 b.obj 链接时,其中外部链接的名字,才涉及到定位
如果发现同一个外部链接的名字在两个 .obj 中都有定义,那么链接器就报告错误:在某 .obj 中的符号 s 已经在另一个某 .obj 中定义
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
当 a.obj 和 b.obj 链接时,其中外部链接的名字,才涉及到定位
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
引用 2 楼 luqichao 的回复:
如果这样,比如一个static修饰的变量s,假设声明在a.h,定义在a.cpp,对应a.obj。在b.h中include了a.h,对应b.obj。最终a.obj和b.obj均链接到一起,成为xxx.exe,那最终的s如何界定呢?
因为s是内部链接的,根本不涉及什么“界定”问题
apexMing 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 yisikaipu 的回复:
一个.cpp以及其包含的和嵌套包含的所有.h所展开的代码(术语叫做 translation unit)编译出来一个.obj 这个.obj里的内部链接的(一般来说即 static 所修饰的)名字在另一个.obj里不可见 就是这么个意思
如果这样,比如一个static修饰的变量s,假设声明在a.h,定义在a.cpp,对应a.obj。在b.h中include了a.h,对应b.obj。最终a.obj和b.obj均链接到一起,成为xxx.exe,那最终的s如何界定呢?
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
一个.cpp以及其包含的和嵌套包含的所有.h所展开的代码(术语叫做 translation unit)编译出来一个.obj 这个.obj里的内部链接的(一般来说即 static 所修饰的)名字在另一个.obj里不可见 就是这么个意思

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧