程序的预处理

本文详细介绍了C语言的编译过程,包括预处理、编译、汇编和链接四个步骤。预处理阶段涉及到宏定义、预定义符号和条件编译,其中宏的使用有其优缺点。条件编译允许根据宏定义决定某些代码是否编译。整个编译过程旨在将源代码转化为可执行文件,并处理跨文件的函数调用和库链接。
摘要由CSDN通过智能技术生成


编译和链接

编译的过程

即.c文件转换成二进制可执行文件的过程。

C语言中,每个.c文件都视为一个“编译单元”。针对每个编译单元,编译器先把.c及所包含的.h文件转换成.o(.o是一个“目标文件”,也是一个二进制的文件了,但是还不能执行)。
链接过程就是把这些.o最后合并到一起。

为什么要进行合并?
实际开发中,经常会把一个函数的定义和调用分散在两个不同的.c中,就会被编译到不同的.o里面。如:a.o包含了test函数的定义,b.o包含了test函数的调用。

链接过程除了要链接用户自己写的文件编译的.o之外,还需要链接一些库文件(标准库,第三方库),此处的库可以是动态库(.dll)的方式提供,也可以是静态库(.a)的方式提供。

printf、strlen这些函数,使用的时候只是包含了.h文件
而头文件中只有声明,没有定义。函数定义也是通过链接过程来找到的。标准库函数的定义是包含在一个动态库中。

编译链接可分为四个过程:
1、预处理:宏替换,头文件展开,预编译指令的处理。正因为头文件展开,导致了待编译文件快速膨胀,后续的编译动作效率会受到很大影响。

2、编译:狭义的编译,特指把.c源代码变成汇编指令。具体涉及词法分析、语法分析、语义分析、中间代码生成、目标代码优化等编译原理相关知识。

3、汇编:把汇编指令变成二进制机器指令。

4、链接:把.o文件合并到一起。

预处理

预定义符号

__FILE__      //进行编译的源文件
__LINE__     //文件当前的行号
			//以上两个打印日志时非常有用
__DATE__    //文件被编译的日期
__TIME__    //文件被编译的时间
			//通过编译时间来区分程序的版本号
__STDC__    //如果编译器遵循ANSI C,其值为1,否则未定义

这些预定义符号都是语言内置的。 例如:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值