C程序的编译和链接

大纲

C程序不能直接机器执行,需要被翻译为机器语言才能被执行 。

预处理

计算机将对所有的.c文件进行以下操作:

1.所有的#define定义将会被删除,并且相对应定义的宏将会被替换。

#define P 5

int main(){                                                             int main(){             
        int  a=P;        >>>>>>>>预处理后>>>>>              int  a=5;

        return 0;                                                                return 0;

}                                                                               }  

 2.所有的条件编译指令将会被处理,如#if、#ifdef、#elif、#else、#endif 。

3.处理#include预编译指令,将包含的头文件的内容展开并替换到此位置,如果头文件内包含了头文件,则从内而外展开。

4.删除所有的注释。

5.添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。

6.或保留所有的#pragma的编译器指令,编译器后续会使⽤。

编译

词法分析

预处理后,计算机内的扫描器将对代码里的各种类型字符进行分类整理生成记号,如:

int arr[20]=6+1;

 int:关键字,arr:标识符,[:左方括号,20:数字,]:右方括号,=:赋值,6:数字,+:加号,1:数字。

语法分析

语法分析器对记号进行语法分析,产生语法树,形成直观的语法关系。

语义分析

语义分析器在语法层面上对语句进行分析判断,包括声明,类型的匹配等,例如char*传参给int*。计算机将在此阶段反馈语法错误。

汇编

经过编译会生成汇编代码文件,将汇编代码转化为机器指令,几乎每一个汇编语句都对应一条机器指令,此阶段进行的是翻译工作。

链接

此阶段将会把编译后生成的目标文件(.o)进行地址和空间分配,符号决议和重定位等,如果一个文件中存在调用其他文件内容,如test1.c调用test2.c中的函数(my_num)或全局变量,在编译test1.c阶段编译器无法知道my_num的实际地址,只能先搁置,链接时,链接器将所有的.o文件链接,此刻将会找到my_num真正的地址,这个地址修正的过程也叫做重定位链接过后,便可完整的执行代码了。

完。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值