文章目录
前言
本文只简单写了关于编译过程,没有写关于链接的过程(太复杂了)!!!
不知道大家平时用的是什么,咱用的vs2022,这个是一个集成开发环境(IDE)默认使用MSVC编译器
咱平时敲完代码能运行起来,简单来说全靠编译和链接
但是由于我学艺不精,链接这一块实在是写不出来
所以,本文就简单讲点关于C语言的编译过程
也用来记录学习(有错误请多指正!
一、翻译环境和运行环境?
咱用Java的时候是不是得配置一下环境?其实这个和咱要说的翻译环境和运行环境是差不多滴
编译和链接需要在翻译环境里找他们需要的工具去执行操作,但同时,编译和链接组成了这个环境,所以他俩相辅相成,少了谁都不行~
运行环境的话,其实类似一个管理员掌管的巨大仓库,操作系统是管理员,仓库里放着一堆运行时需要的东西
比如运行需要的库文件、咱这个内存怎么样才能正确访问、系统硬件(内存,处理器,硬盘)之类的。。。
二、编译
A.编译
编译可以分为:
预处理(预编译),编译,汇编
1.预处理(预编译)
在这个过程会进行以下操作:
1.1删除 #define 并展开宏定义(给define定义的东西替换掉)
例:
#define HW printf("Hello World");
#include <stdio.h>
int main()
{
HW;//替换后HW直接被覆盖成:printf("Hello World")
return 0;
}
1.2处理条件编译指令(#if、#ifdef…)
在这个过程会处理条件编译指令,如果不满足条件则不参与编译
例:
#include <stdio.h>
#define i 0
int main()
{
#if i == 0
printf("i是0");
#elif i == 1
printf("i是1");
#else
printf("i输入错误");
#endif
return 0;
}
如图所示,i == 0时候,下面那两个都变灰了,他们就不参与编译
1.3处理#include(给头文件里的内容覆盖到对应#include所在的位置)
由于头文件内容太长,不好操作,这里就不展示哩
咱可以通过 Ctrl + 鼠标左键 来查看头文件内容
图是 stdio.h 内容
1.4删除所有注释
字面意思(((
1.5添加行号和文件名标识
这里文件名因为社恐,给自己打了一层码(X
1.6编译
编译过程是对上面预处理完的文件进行词法分析、语法分析、语义分析及优化,来生成汇编文件
1.6.1词法分析
词法分析其实就是给代码 每个单词 分割成一个一个单独的 记号(左右括号,加减乘除,数字…之类的
例:
arr[i] = (i+4)*(2+6);
1.6.2语法分析
语法分析器扫描一下上面得出的结果,并创建一个树(表达式为节点)
1.6.3 语义分析
检查语法对不对,类型对不对,类型转换有没有出错之类的
然后报错(X
B.汇编
这个过程就是纯纯翻译
让人写的代码转换成机器能看懂的东西
汇编指令 -> 机器指令
C.链接
简单来说就是把所有文件都链接起来(链接过程很复杂,这里就不写了),生成一个可执行文件,也就是.exe文件
总结
嗯。。。简单写了点C语言的编译
这一块有点复杂,没研究透,大部分还是边看别人写的,如果有错误的地方,或者需要补充的地方
可以留言(