程序运行需要将 源代码->二进制 计算机只能执行二进制的指令
就需要翻译环境,进行如下步骤
每个文件都单独编译,生成.obj文件
每个阶段(预编译 编译 汇编)都干了如图所示的事情
预处理(预编译)完成了一些文本操作,头文件的包含,定义符号(#define)直接替换,宏,注释删除
条件编译在预处理(预编译)阶段完成
在编译阶段记录各个.c文件的符号:如全局变量,函数名,像局部变量是不关心的。
汇编 生成各自的符号表,在链接 阶段 合并每个文件的符号表和符号表的重定位
如果找不到正确的Add 的符号,就会发生链接错误
链接期间 通过符号表中的地址 对跨文件的符号进行查找,如果没有就报错,这就是符号表作用
这就是从源文件到可执行程序(二进制)的过程
附:根据符号表汇总合并的逻辑,函数在不同文件中即使不声明也可以使用,但编译器会报警告
如果不声明全局变量,编译器会报错,综合来说,不管是全局变量还是函数,在使用前都需要声明