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 )为后缀的文件,但是无法发开:

四,链接

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/632861.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

非授权人员进入报警系统

非授权人员进入报警系统基于智能视频分析技术和深度学习技术,非授权人员进入报警系统通过现场已经装好的监控摄像头针对人体进行精准检测,并根据设置的禁入区范围进行判断。通过图像处理和人体识别算法,非授权人员进入报警系统可以在实时监测…

力扣279. 完全平方数

Problem: 279. 完全平方数 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义一个int数组dp初始化长度为n1; 2.状态初始化:当n等于0时,dp[0]为0;并且每次每次先初始化dp[i] i,即表示为i时的最大所需完全平方根的…

FreeRTOS_互斥量_学习笔记

互斥量 数值只有0或1 谁获得互斥量,就必须由谁释放同一个互斥量。 但其实在freeRTOS中,任务A获取的互斥锁,任务B也能释放。因此谁上锁谁开锁只是约定,在程序实现上不是强制的。 “可重入的函数"是指:多个任务同时…

VMware ESXi 7.0 U3q 发布 - 领先的裸机 Hypervisor

VMware ESXi 7.0 U3q 发布 - 领先的裸机 Hypervisor VMware ESXi 7.0 Update 3 Standard & All Custom Image for ESXi 7.0U3 Install CD 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3/,查看最新版。原创作品,转载请保留出…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建(wsl2+ubuntu+quem+xv6)

MIT6.S081(操作系统)学习笔记 操作系统入门系列-MIT6.828(操作系统)学习笔记(一)---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二&am…

常见算法(1)

1.基本查找/顺序查找 核心:从0索引之后挨个查找 实现代码: public class test {public static void main(String [] arg) throws ParseException {int[] arr {121,85,46,15,55,77,63,49};int number55;System.out.println(bashi(arr,number));}publi…

三分钟学会视频号卖货,真的太简单了!

大家好,我是电商糖果 视频号小店绝对是今年最火的电商平台之一,再加上它刚进军电商行业,大家都想吃到第一口红利。 小店之所以这么受欢迎,其实看中是它背后微信的十几亿真实用户。 微信的流量可以直接进入视频号,因…

企业知识库智能问答系统的实践

1、页面效果 PC端 2、页面效果 手机端 3、主要支持功能 新建会话 历史会话 2、智能问答 支持 文本分类和意图识别,支持基于大模型的对话理解,支持流式对话 3、支持手机端 语音识别 4、主要服务包括 向量库Milvus 向量计算和文本分类服务 …

618必入好物清单!五款人气实用好物推荐

朋友们!一年一度的618购物狂欢节又要来啦!是不是已经迫不及待想要给自己的购物车添点新货了?小编特地搜罗了五款人气爆棚、实用到没朋友的“必入好物”。从日常生活小物到提升生活品质的利器,精挑细选保证买得开心、用得顺心。赶紧…

ROS | 自定义发布地图

C代码: Step: Python代码:

[实例] Unity Shader 逐像素漫反射与半兰伯特光照

漫反射光照是Unity中最基本最简单的光照模型,本篇将会介绍在片元着色器中实现反射效果,并会采用半兰伯特光照技术对其进行改进。 1. 逐顶点光照与逐像素光照 在Unity Shader中,我们可以有两个地方可以用来计算光照:在顶点着色器…

QT控件QDialog结合QDialogButtonBox实现确认弹窗

项目需要二次确认开启,添加一个确认弹窗,采用QDialog并添加按钮控件。 QDialogButtonBox控件用于添加按钮组,初始化时可以增加标准按键,但是不能自定义按钮文字。 想要更改按键大小,但是没有提供设置组内按钮大小的函数…

创建型模式之单例

文章目录 概述定义场景小结 概述 设计模式包括创建型模式,结构型模式,行为型模式。 今天先看看创建型模式,而单例是创建型模式中的第一个而且是常用的,就从它开始吧。 定义 单例模式用来创建全局唯一的对象。一个类只允许创建一…

5.23 学习总结

一.项目优化(语音通话) 实现步骤: 1.用户发送通话申请,并处理通话请求,如果同意,为两个用户之间进行连接。 2.获取到电脑的麦克风和扬声器,将获取到的语音信息转换成以字节数组的形式传递。 …

小林coding笔记

MySQL执行流程 MySQL 的架构共分为两层:Server 层和存储引擎层。Server 层负责建立连接、分析和执行 SQL。存储引擎层负责数据的存储和提取。 Mysql执行 启动Mysql net start mysql登陆 mysql -u root -p输入密码

C++之单链表与双链表逆序实例(二百七十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

17款奔驰GLS450升级头等舱行政独立四座马鞍是什么样体验

五座版本:迈巴赫GLS480的五座版本通常指的是具有五个座位的配置,包括两个前排座椅和三个后排座椅。这种配置适合搭载更多乘客,后排座椅通常为三人座设计,乘坐人数较多。 四座版本:迈巴赫GLS480的四座版本通常指的是具…

正点原子LWIP学习笔记(二)MAC简介

MAC简介 一、MAC简介(了解)二级目录三级目录 二、ST的ETH框架(了解)三、SMI站管理接口(熟悉)四、介质接口MII、RMII(熟悉) 一、MAC简介(了解) STM32 的 MAC …

c++笔记3

优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。优先队列是一种按照优先级决定出队顺序的数据结构,优先队列中的每个元素被赋予级别,队首元素的优先级最高。 例如:4入队&#xff0c…

Python筑基之旅-MySQL数据库(一)

目录 一、MySQL数据库 1、简介 2、优点 2-1、开源和免费 2-2、高性能 2-3、可扩展性 2-4、易用性 2-5、灵活性 2-6、安全性和稳定性 2-7、丰富的功能 2-8、结合其他工具和服务 2-9、良好的兼容性和移植性 3、缺点 3-1、对大数据的支持有限 3-2、缺乏全文…