C/C+编程笔记:C语言的编译器工作原理

2020年12月07日23:40:10 科技 1738

以gcc编译器为例子,编译实际上总共经历了四个阶段

预处理--->编译--->汇编--->链接

C/C+编程笔记:C语言的编译器工作原理 - 天天要闻

1.预处理阶段:编译器以cpp文件作为一个单元,首先读这个cpp文件,发现第一句与第二句包含一个头文件,就会在所有搜索路径中寻找这两个头文件,找到之后,就会到相应头文件中再去处理宏、变量、函数声明、嵌套的头文件等。

检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进这个当前的cpp文件中,形成一个中间"cpp文件"。

在这一步中相当于将那个头文件中的test变量扫描进了一个中间cpp文件,那么test变量就变成了这个文件中的一个全局变量。在stdio.h这个头文件中有一些函数的声明,这时也把这些函数的声明一股脑的扫描到了这个中间cpp文件中(只是扫描了函数的声明,并没有实现)。

C/C+编程笔记:C语言的编译器工作原理 - 天天要闻

2.编译阶段:此时就为这个中间cpp文件的所有变量、函数形参分配空间(原则上,在这里只能看到.h文件中函数、变量的声明,为变量和函数的形参等分配空间),将各个函数编译成二进制码,按照特定目标文件格式生成目标文件。

在这种格式的目标文件中进行各个全局变量、函数的符号描述(编译器维护一个符号描述表),将这些二进制码按照一定的标准组织成一个目标文件。

C/C+编程笔记:C语言的编译器工作原理 - 天天要闻

此时的每一个cpp文件都被编译器编译成了一个目标文件,同时每个目标文件都有一张符号表,这张符号表中记录了这个cpp文件都用到了哪些变量,哪些函数,函数的参数是什么类型的,有几个参数。

同时为变量和函数形参开辟了内存空间。所以这里编译器把你这个cpp用到的所有的东西都记录下来了,如果有重复定义或者没有定义的变量、函数等,编译器一下子就知道了。

3.连接阶段:将上一步成生的各个目标文件,根据一些参数,连接生成最终的可执行文件,主要的工作就是重定位各个目标文件的函数、变量等,相当于将个目标文件中的二进制码按一定的规范合到一个文件中。

C/C+编程笔记:C语言的编译器工作原理 - 天天要闻

科技分类资讯推荐

三星Galaxy Watch Ultra 2025发布 售价4999元 - 天天要闻

三星Galaxy Watch Ultra 2025发布 售价4999元

7月9号消息,三星在今晚带来了一系列新品,其中Galaxy Watch Ultra(2025)可应对高达55℃的高温、9000米海拔高度和10个大气压的深海压力,并且搭载新一代3nm处理器,运行更平稳。
Imagination GPU部门被中芯国际收购?官方回应 - 天天要闻

Imagination GPU部门被中芯国际收购?官方回应

近日有网传消息称,中芯国际通过全资子公司以5.6亿美元现金收购英国Imagination GPU IP部门,甚至交易已经获得中国和欧盟监管部门的批准。Imagination官方也被逼无奈,通过官方公众号发布了一份澄清函。
全网最严格,白泽奖评测标准公开 - 天天要闻

全网最严格,白泽奖评测标准公开

辅助驾驶的评测方式五花八门,但是我们发现一个问题,那就是大多数的评测都是将主动安全、领航辅助与智能泊车分开。并且这里面缺失了一个很重要的东西,那就是用户调研。我们做白泽奖,目的是做全面的评测和评价,那么用户调研就是必不可少的一部分。白泽奖是
北方桑拿天超长待机 未来一周这些地区人员注意防暑 - 天天要闻

北方桑拿天超长待机 未来一周这些地区人员注意防暑

近期,我国南北方多地持续高温酷热未来一周,北方桑拿天频现不少地方体感温度可达40℃以上将生生被“蒸”服其中,山东、河南等地热得十分突出济南、郑州桑拿天将天天见北京、天津、石家庄等地桑拿天也可持续6天未来十天河北中南部、黄淮、江汉及陕西关中等地将持续高温部分地区最高气温可达39至41℃注意防暑降温!(来...