c文件编译过程

本文详细阐述了C源程序如何通过预处理器整合头文件,编译器转化为中间代码,再经汇编器生成可重定位机器代码,最后链接器完成目标文件与库文件的链接,形成可执行程序的过程。特别强调了预处理器与链接器的区别和各自功能示例。
摘要由CSDN通过智能技术生成

计算机只可看懂机器语言,但是c是高级语言所以需要将高级语言转化为机器语言。
而编译器与汇编器就是做这个工作的

总过程

源程序  = 预处理器 => 经过预处理过的源程序  = 编译器 => 中间代码【中间代码一般实现过程  目标汇编程序  = 汇编器 =>  可重定位机器代码】 
库文件及可重定位对象文件和可重定位机器代码  = 链接器/加载器 =>  目标机器代码

预处理器作用

程序可能会有多个模块,被分别放置在独立的文件中,那么在目标文件 的形成过程中,需要将各个模块进行整合在一起。而进行这个功能的程序叫作预处理器。预处理器还会将宏的缩写形式转换为源语言的语句。
例如头文件的引用,他会将头文件的内容当做一个模块,现将这个模块与主程序模块进行整合。

中间代码最普遍形式

将源代码转为机器语言代码并将结果放入目标代码文件【.obj】。因为目标文件中存储的是编译器翻译的源代码,并不是一个完整程序所以不能直接运行,因为他缺失启动代码【系统与操作系统的接口】和库函数【库文件中的目标代码库代码的一部分】。

链接器作用

大型程序经常被分为多个部分进行编译,因此需要将可重定位的机器代码与其他可重定位的目标文件以及库文件连接在一起
而链接器作用就是将目标代码、系统的标准启动代码和库代码合并为可执行文件【.exe】

中间代码的形成过程

编译器编译而成的汇编程序 =汇编器=> 可重定位的机器代码

汇编器

将汇编语言根据机器的指令集转换为机器语言的软件

加载器作用

将所有可执行目标文件放到内存中执行

示例

区分预处理与链接器

预处理与链接器可能容易搞混,这里举个例子
预处理的宏展开不用说,这里仅看复制粘贴操作与链接器链接分别是负责哪部分的
现有test.c源文件,testh.h头文件,与testh.c头文件的实现
在test.c中使用了testh.h源文件,进行预处理后,头文件的内容全部搬到test.c中,但是头文件的实现仍没有搬到源文件中,他与源文件仍是分别处于两个没有关系的文件。
而链接器在链接时,将实现的机器码与源文件机器码进行链接,这样,有一些函数就拥有了具体的定义。整个文件才可以使用。
以上理论对于库文件也是同样的解释

预处理前的操作

编译第一步——字符的映射

编译的第一步编译器会将源代码中的字符映射到字符集。该过程多处理多字节字符,其实就是将字符扩展。

第二步——续行符取消

将程序中反斜杠后紧跟一个换行符 的删去【删去反斜杠及紧跟的一个换行符】
此处换行符指的是按回车后形成的空白符,不是\n。
将物理行转变为逻辑行

第三步——文本划分

编译器会将文本划分为预处理记号序列、空白序列和注释序列。
之后编译器会用一个空格字符替换每一个注释。而且将一个空格去替换所有的空白字符序列【除了换行符】
之后便开始预处理指令,预处理器查找预处理命令去执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值