前言
最近好像被限流了很烦=-=
程序的翻译环境和执行环境
翻译环境类比于我们的VS2019集成开发环境
如图:
我们的可执行程序在生成的过程中,先将源文件逐个单独(一定是逐个单独)交给编译器使其变成我们连接器可以使用的目标文件(在Windows系统的拓展名是.obj )如test.c—>test.obj,然后经过连接器统一处理变成可执行程序.
翻译环境如何工作
围绕着这个两个图展开
分两大步——编译和链接。
编译1
编译这一步通过编译器完成
编译又分
预编译(也叫预处理)
完成了头文件的包含
#define定义的符号和宏的替换
删除注释
一系列的文本操作
编译
语法分析
词法分析
语义分析
符号汇总
也就是将C语言代码转换成了汇编代码。
汇编
将汇编代码转换成二进制也就是机器语言
生成符号表
生成了.obj的文件(他的格式elf),我们可以通过readelf这个工具来观察这个文件.
预编译
当我们想在gcc编译器下得到预编译后的结果可以通过输入:gcc test.c -E这样我们就得到了预编译后的文件test.i
功能一:完成头文件的包含
原代码:
后得到的文件内容:
又分为了两个部分:
1.看不懂的部分
而这我们看不懂的部分其实是对#include<stdio.h>的操作.他讲stdio.h内的文件包含到了我们的函数内
注:我们的stdio.h文件并非仅仅只有这些只是但是并非我们需要重视的知识点.
2.几乎和我们代码相同的部分
这些就是我们的代码
功能二: #define定义的符号和宏的替换
原代码:
预编译后:
我们之前通过#define定义的均已被替换我们的#define也已经被处理不见.
功能三: 删除注释
直接将注释删除(偷个懒)
所以无论写多少注释都不会对程序运行产生影响