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

C语言学习笔记——编译和链接

目录

  • 1 C程序的执行流程
  • 2 翻译环境
    • 2.1 预编译
    • 2.2 编译
      • 2.2.1 词法分析
      • 2.2.2 语法分析
      • 2.2.3 语法分析
    • 2.3 汇编
    • 2.4 链接

1 C程序的执行流程

用户编写好的C程序不能直接被计算机识别并执行,在执行前,要先将源文件和头文件进行编译,生成目标文件,再将目标文件与链接库进行链接,生成最终的可执行程序,再由计算机执行
其中,将源代码转换成可执行的机器指令的过程被称为 翻译环境
执行代码的过程被称为 执行环境
在这里插入图片描述

在这里,主要说明翻译环境所做的事情

2 翻译环境

翻译环境主要有 编译和链接 两个处理过程
编译的过程还可以拆分为 预编译,编译,汇编 三个小的过程
因此,翻译环境的处理过程为 预编译,编译,汇编,链接
在这里插入图片描述

2.1 预编译

预编译阶段所做的事情包括:

  • 在代码中,将 #define 定义的常量用它的值进行替换
  • 将头文件引入至 #include 的位置处
  • 处理条件编译指令,比如:#if,#ifdef,#elif等
  • 删除程序内的所有注释
  • 生成行号和文件名
  • 保留 #pragma 的编译器指令

预编译阶段结束后,会产生 .i 后缀的文件

2.2 编译

编译阶段所做的事情包括 词法分析,语法分析,语义分析及优化
编译结束后,会产生 .s后缀的文件,它保存的都是汇编代码
接下来,针对下面这句代码来进行说明

array[index] = (index+4)*(2+6);

2.2.1 词法分析

在词法分析中要做的事情就是分析代码,将代码拆分成符号
上方的这句代码,就可以做这样子的拆分:
在这里插入图片描述

2.2.2 语法分析

在语法分析中要做的事情是分析词法分析阶段产生的符号,从而得到语法树
上面这句代码的语法树如下:
在这里插入图片描述

2.2.3 语法分析

语法分析要做的事情就是根据语法树来判断正在分析的代码是否有语法错误,因此,如果有语法错误,会在这个阶段报错
在这里插入图片描述

2.3 汇编

汇编阶段要做的事情就是将 编译阶段产生的 .s后缀文件进行解析,生成 .o/.obj 后缀的目标文件,在目标文件内,保存了机器指令,机器指令为计算机可以识别并执行的指令

2.4 链接

每一个源文件,在经过了 预编译,编译,汇编 的过程后,都会生成 .o/.obj 后缀的目标文件,在链接的阶段,就会将这些目标文件链接在一起,生成可执行程序
链接主要有 空间分配,符号决议,重定位 这些过程

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

相关文章:

  • Vue 自定义水印指令实现方案解析
  • ClickHouse集群部署实践---3分片2副本集群
  • 主成分分析加强版:MP-PCA
  • fio文件读写io带宽测试工具
  • 从零构建TransformerP2-新闻分类Demo
  • Spring AI 系列之三十九 - Spring AI Alibaba-集成百炼知识库
  • 【Python-Day 38】告别通用错误!一文学会创建和使用 Python 自定义异常
  • 【Nginx基础①】 | VS Code Remote SSH 环境下的静态资源与反向代理配置实践
  • 明厨亮灶场景下误检率↓76%:陌讯多模态融合算法实战解析
  • 蓝桥杯----大模板
  • 【NFTurbo】基于DockerCompose一键部署
  • Redis中String数据结构为什么以长度44为embstr和raw实现的分界线?
  • 【大模型实战篇】部署GPT-OSS-120B踩得坑(vllm / ollama等推理框架)
  • 数据库索引创建的核心原则与最佳实践
  • JAVA 分布式锁的5种实现方式
  • 【C++高阶五】mapset对红黑树的封装
  • 【昇腾】Atlas 500 A2 智能小站制卡从M.2 SATA盘启动Ubuntu22.04系统,重新上电卡死没进系统问题处理_20250808
  • 图片识别表格工具v3.0绿色版,PNG/JPG秒变可编辑Excel
  • Redis初步介绍和分布式系统介绍
  • 项目一系列-第4章 在线接口文档 代码模板改造
  • 临床医学 RANDOM SURVIVAL FORESTS(randomSurvivalForest)-2 python 例子
  • shell脚本使用
  • 软件销售跟进思路
  • 期货和期权对冲后能盈利吗?
  • 大力水手4——AI驱动的多帧生成与神经网络渲染
  • MySQL NULL 值处理详细说明
  • 《天天酷跑》:用Pygame打造经典跑酷游戏的开发与玩法全解析
  • 库函数NTC采样温度的方法(STC8)
  • react的form.resetFields()
  • cuda编程之内核执行配置参数