很喜欢一部动漫,《星游记》,有这样一句话:“管你什么乱起八糟的,我们只是要,往前走啊!”![](https://img-blog.csdnimg.cn/direct/2edbb0f170ff450483c9d23732541ae9.png)
在学习ANSI C中,代码的实现都需要俩种环境:翻译环境,运行环境。
其一:翻译环境:将源文件转化为机器可识别的二进制指令。
其二:运行环境:执行机器可识别的二进制指令。
进行细分,可将翻译环境分为俩个阶段:编译,链接。
其一:编译阶段:一个项目中可有多个源文件(.c),多个源文件单独经过编译器处理生成对应 的目标文件(.obj)。
其二:链接阶段:编译阶段生成的多个目标文件和链接库一起经过链接器的链接生成最终的 可执行程序(主要进行,合并段表,符号表的合并,符号表的汇总)。
以上俩个阶段生成的都是机器可识别的二进制指令。
再进行细分,可将编译阶段可分为三个步骤:预处理,编译,汇编。
其一:预处理:将后缀为.c的文件转化为.i的文件。主要做了注释的删除,预处理指令的处 理(例如头文件的包含,宏的替换,条件编译的处理),相当于修理.c文件边角
其二:编译:将后缀为.i的文件转化为.s的文件(汇编指令)。进行了语法分析,词法分析,语 义分析,符号汇总(重点聊)。
其三:汇编:将后缀为.s的文件转化为.obj的文件(机器可识别的二进制指令)。主要是形成符 号表(重点聊)。
将以上知识为大家画一幅逻辑图方便我们清楚的观看和理解整体的框架,如图一。
![](https://img-blog.csdnimg.cn/direct/65b01b98433b4f89a4127a31d852a3df.png)
上面提到重点聊的内容是编译阶段中编译的符号汇总和汇编的形成符号表(只针对全局作用域)以及链接的符号表的合并,符号表的汇总,用下面代码来解析,如图二。
![](https://img-blog.csdnimg.cn/direct/e1c2e3deeb904caf9203a28e27e556c1.png)
经过上图,可推出不同源文件(.c)之间建立起真正的联系,使函数,全局变量具有了外部链接属性,进而也可以解释清楚前面学过的static修饰的全局变量和函数,表面上看是作用域从整个工程缩小到当前的源文件,实则是将外部链接属性变为内部链接属性。