当前位置: 首页 > news >正文

C语言程序的编译

目录

一、预处理(预编译)

二、编译

三、汇编

四,链接


  • 在前面讲到了宏的定义,那么宏在编译时候是如何发生替换的?接下来做一下详细的介
  • 绍C语言程序的编译过程主要包括以下几个步骤:预处理、编译、汇编和链接。

一、预处理(预编译)

预处理阶段:预处理器会处理源代码中的预处理指令,如宏定义、头文件包含、条件编译等,生成一个经过预处理后的文件。

  • 宏展开(Macro Expansion):预处理器首先查找并替换所有的宏定义,包括对象宏、函数宏以及带参数的宏。 
  • 文件包含(File Inclusion):#include指令指示预处理器读取并插入指定文件的内容到当前源文件中。 
  • 条件编译(Conditional Compilation):通过#if、#ifdef、#elif、#else、#endif等指令实现条件编译,根据预定义标识符或用户自定义的宏来决定哪些代码段参与最终的编译。 
  • 注释删除(Comment Removal):预处理器会移除所有源代码中的注释,确保注释内容不会影响编译结果。 
  • 行号和文件名标识(Line and File Name Marking):添加行号和文件名标识,方便后续编译器生成调试信息。 
  • 处理预定义符号:C语言预设了一些预定义符号,这些预定义符号也是在预处理期间处理的,如__FILE__、__LINE__、__DATE__、__TIME__等。

若要将预处理后的代码保存到文件中,可以使用gcc -E yourfile.c -o yourfile.i,这样会将预处理后的代码保存到yourfile.i文件中。

在 gcc环境下,生成了 ( . i) 为后缀的文件,在预编译期间的执行的操作,如图:

( .c)文件

( . i)文件

二、编译

编译阶段:编译器将预处理后的文件进行词法分析、语法分析、语义分析等操作,生成一个汇编代码文件。 

在gcc环境下,gcc -S yourfi指令,生成( .s )文件,此时的C语言代码就生成了汇编代码,如图:

三、汇编

汇编阶段:汇编器将汇编代码翻译成机器代码,生成一个目标文件。

  • 生成目标代码:将汇编代码翻译成机器码指令,并将这些指令打包形成可重定向的目标文件,通常是.o文件,它是二进制文件。 
  • 形成符号表:对应全局函数和库函数的地址将其符号表的形式保存,以便后续的链接阶段可以使用。 
  • 准备可执行文件:将生成的目标文件与其他目标文件和库文件链接起来,形成最终的可执行文件,如.exe文件。 
  • 优化代码:在汇编过程中,编译器会对代码进行优化,以提高程序的效率和性能。 
  • 处理异常和错误:在汇编过程中,编译器会检测并处理可能出现的异常和错误,以确保程序的正确性和稳定性。 
  • 生成调试信息:为了方便开发者进行调试,编译器会在汇编阶段生成相关的调试信息,如行号、变量名等。

在gcc环境下,gcc -c yourfile.c指令,可生成( .o )为后缀的文件,但是无法发开:

四,链接

链接阶段:是将编译后的目标文件与所需库文件合并,解决符号引用和地址重定位,生成可执行文件的过程。

链接的重要性在于它能够将分散在不同文件中的代码片段整合成一个完整的程序。在链接过程中,程序中的符号引用会被解析到它们在内存中的实际地址,确保程序的正确执行。

http://www.lryc.cn/news/350675.html

相关文章:

  • 滴滴三面 | Go后端研发
  • 深度学习之基于Yolov3的行人重识别
  • 防火墙最新技术汇总
  • PikaUnsafe upfileupload
  • git拉取项目前需要操作哪些?
  • 报名开启!2024 开源之夏丨Serverless Devs 课题已上线!
  • DataBinding viewBinding(视图绑定与数据双向绑定)简单案例 (kotlin)
  • TensorFlow基于anaconda3快速构建
  • 力扣72-编辑距离
  • K8S 删除pod的正确步骤
  • 羊大师分析,羊奶健康生活的营养源泉
  • 刷屏一天GPT-4o,发现GPT4用的都还不熟练?戳这儿
  • 力扣HOT100 - 139. 单词拆分
  • rush 功能特性梳理
  • 算法分析与设计复习__递归方程与分治
  • apk-parse包信息解析
  • AI绘画进阶工具ComfyUI 傻瓜整合包安装教程!模型共享,一键安装!
  • 无人机摄影测量数据处理、三维建模及在土方量计算
  • 大模型平台后端开发(xiaomi)
  • 性能测试工具—jmeter的基础使用
  • 前端 JS 经典:CommonJs 规范
  • 三分钟速览量化交易系统:揭秘QMT与Ptrade(内附免费提供渠道)
  • 处理QTcpSocket接收到数据的槽函数
  • 回归的无分布预测推理
  • 有限域中的一些概念
  • 使用css的box-reflect属性制作倒影效果
  • ChatGPT 4o 使用案例之一
  • 【免费Web系列】大家好 ,今天是Web课程的第一天点赞收藏关注,持续更新作品 !
  • C++|树形关联式容器(set、map、multiset、multimap)介绍使用
  • springboot整合s3,用ImageIO进行图片格式转换