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

C语言(长期更新)第23讲:编译和链接

  C语言(长期更新)第23讲

编译和链接

     跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力博主主页:潼心1412o-CSDN博客


目录

  C语言(长期更新)第23讲

编译和链接

知识回顾

23.1 翻译环境和运行环境

23.2 翻译环境

23.2.2 编译

23.2.3 汇编

23.2.4 链接

23.3 运行环境


知识回顾

上节课我们学习了文件操作,今天我们来继续学习编译和链接,坐稳了,我们发车,gogogo,出发喽!


23.1 翻译环境和运行环境

在ANSI C 的任何一种实现中,存在两个不同的环境

第一种是翻译环境,在此环境中源代码被转换为可执行的二进制指令(机器指令)

第二种是执行环境,用于实际执行代码

23.2 翻译环境

翻译环境由编译和链接两个大的过程组成

编译可分为预处理(预编译)编译 汇编三个过程

1.一个C语言项目由多个.c文件构建

2.每个.c文件经过编译器生成对应的目标文件

Windows环境下目标文件后缀为.obj,Linux环境下后缀为.o

3.多个目标文件和链接库一起经过链接器处理生成最终的可执行程序

Windows环境下k可执行程序文件后缀为.exe,gcc无,需自定义

链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库

把编译过程再展开,可以得到3个过程

23.2.1 预处理

预处理阶段主要处理那些源⽂件中#开始的预编译指令 ⽐如:#include,#define

处理的规则如下:

  • 将所有的 #define 删除,并展开所有的宏定义。
  • 处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif
  • 处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。
  • 删除所有的注释
  • 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。
  • 或保留所有的#pragma的编译器指令,编译器后续会使⽤。

经过预处理后的 .i ⽂件中不再包含宏定义,因为宏已经被展开。并且包含的头⽂件都被插⼊到 .i⽂件中。所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的 .i ⽂件来确认

23.2.2 编译

编译包括词法分析,语法分析,语义分析及优化

词法分析

源代码程序输入扫描器后,会进行简单的词法分析,将代码中字符分割成一系列的记号

如关键字,标识符等等

比如这段代码

会被拆分为16个记号

然后是语法分析

语法分析器会对扫描产生的记号进行语法分析,从而产生语法树

语法树以表达式为节点

语义分析

由语义分析器完成静态语义分析

通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息

23.2.3 汇编

汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化

23.2.4 链接

链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤

链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题

23.3 运行环境

1. 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。

2. 程序的执⾏便开始。接着便调⽤main函数。

3. 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。

4. 终⽌程序。正常终⽌main函数;也有可能是意外终⽌。


 好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~​​​​ 

博主主页:潼心1412o-CSDN博客

http://www.dtcms.com/a/403402.html

相关文章:

  • 怎么做网站后端手机登录凡科网
  • 如何自查家里宽带是否有公网IPv4?就几步。
  • Android studio导入OpenCV报“Unresolved reference: android“
  • 如何管理网站域名服务器做php网站
  • (Arxiv-2025)OmniInsert:无遮罩视频插入任意参考通过扩散 Transformer 模型
  • 大模型实战:通义万相2.1-文生视频-1.3B
  • 【C语言】统计二进制中1的个数:三种方法的比较与分析
  • C语言:数组元素逆序存放
  • C++(day1)
  • 如何让百度抓取网站wordpress 免费插件
  • 无人机无线电测距模块技术要点与难点
  • 逻辑回归中的成本损失函数全解析:从数学推导到实际应用
  • 组件化思维(下):表单与交互组件,倾听用户的心声
  • 机器学习——逻辑回归详解
  • wordpress做英文站最打动人心的广告语
  • 支持向量机深度解析:从数学原理到工程实践的完整指南——流式在线学习、增量 SVM 与万亿参数时代的挑战
  • 时间复杂度与空间复杂度系统梳理与实战
  • 三轴正交磁力矩器输出力矩计算原理及实现
  • 小组网站建设方案书网站seo优化关键词快速排名上首页
  • 淘宝cms建站wordpress调取某页面
  • STM32的HAL库驱动ADS124S08进行PT100温度采集
  • 软件报错处理合集,大部分情况需要下载Webview2、.NET4.8、获取C盘管理员权限等
  • Jakarta EE 实验 — Web 聊天室(过滤器、监听器版)进阶
  • 腾讯风铃怎么做网站wordpress添加百度统计代码
  • JMeter的取样器
  • LSTM自然语言处理情感分析项目(一)构建词汇表
  • 门户网站建设ppt方案企业网站建设教程pdf
  • 搭建网站的企业淘客帝国 wordpress
  • HarmonyOS 5 网络编程与数据存储实战:从RESTful API到本地持久化
  • Vue.js 生命周期详解