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 如果要用其它模块定义的变量和函数,直接包含其头文件即可。
当 a.obj 和 b.obj 链接时,其中外部链接的名字,才涉及到定位
如果这样,比如一个static修饰的变量s,假设声明在a.h,定义在a.cpp,对应a.obj。在b.h中include了a.h,对应b.obj。最终a.obj和b.obj均链接到一起,成为xxx.exe,那最终的s如何界定呢?
一个.cpp以及其包含的和嵌套包含的所有.h所展开的代码(术语叫做 translation unit)编译出来一个.obj 这个.obj里的内部链接的(一般来说即 static 所修饰的)名字在另一个.obj里不可见 就是这么个意思
64,642
社区成员
250,580
社区内容
加载中
试试用AI创作助手写篇文章吧