当前位置: 首页 > 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 )为后缀的文件,但是无法发开:

四,链接

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

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

相关文章:

C语言程序的编译

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

滴滴三面 | Go后端研发

狠狠的被鞭打了快两个小时… 注意我写的题解不一定是对的,如果你认为有其他答案欢迎评论区留言 bg:23届 211本 社招 1. 自我介绍 2. 讲一个项目的点,因为用到了中间件平台的数据同步,于是开始鞭打数据同步。。 3. 如果同步的时候…...

深度学习之基于Yolov3的行人重识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…...

防火墙最新技术汇总

防火墙技术持续发展,以应对日益复杂的网络安全威胁。以下是防火墙领域的一些最新技术汇总: 下一代防火墙(NGFW):NGFW结合了传统防火墙的分组过滤和状态检测功能,还集成了深度包检测(DPI&#xf…...

PikaUnsafe upfileupload

1.client check 客户端检测,前端js检测,禁用js和修改后缀名即可。 php格式不能上传,我们修改后缀上传。 蚁剑成功连接。 2.MIME type 这个就是 content-type 规定上传类型,上面的方法也能成功,也可以修改 conten-ty…...

git拉取项目前需要操作哪些?

1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa:(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase:(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…...

报名开启!2024 开源之夏丨Serverless Devs 课题已上线!

Serverless 是近年来云计算领域热门话题,凭借极致弹性、按量付费、降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域。 Serverless Devs 是一个由阿里巴巴发起的 Serverless 领域的开源项目,其目的是要和开发者们…...

DataBinding viewBinding(视图绑定与数据双向绑定)简单案例 (kotlin)

先上效果: 4个view的文字都是通过DataBinding填充的。交互事件:点击图片,切换图片 创建项目(android Studio 2023.3.1) Build.gradle(:app) 引入依赖库(完整源码) buildFeatures { vie…...

TensorFlow基于anaconda3快速构建

基于python构建太累 Installing Packages - Python Packaging User Guide 使用 pip 安装 TensorFlow 有兴趣自己学,我放弃了 -------------------------------------------------------- 下面基于anaconda 1、下载 Index of /anaconda/archive/ | 清华大学开…...

力扣72-编辑距离

题目链接 记忆化搜索: 解题关键:每次仅考虑两字符串word1、word2分别从0 - i修改成0-j下标的完全匹配(下标表示) 临界条件:当 i 或 j 小于0时,表示该字符串为空,编辑距离确定为 y1 或 x1 int dp[501][501…...

K8S 删除pod的正确步骤

在日常的k8s运维过程中&#xff0c;避免不了会对某些pod进行剔除&#xff0c;那么如何才能正确的剔除不需要的pod呢&#xff1f; 首先&#xff0c;需要查出想要删除的pod # 可通过任意方式进行查询 kubectl get pods -A |grep <podname> kubectl get pods -n <names…...

羊大师分析,羊奶健康生活的营养源泉

羊大师分析&#xff0c;羊奶健康生活的营养源泉 羊奶&#xff0c;作为一种古老的饮品&#xff0c;近年来因其独特的营养价值和健康益处而备受关注。今天&#xff0c;羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…...

刷屏一天GPT-4o,发现GPT4用的都还不熟练?戳这儿

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...

力扣HOT100 - 139. 单词拆分

解题思路&#xff1a; 动态规划 class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordDictSet new HashSet(wordDict);boolean[] dp new boolean[s.length() 1];dp[0] true;for (int i 1; i < s.length(); i) {…...

rush 功能特性梳理

Rush 可以让 JavaScript 开发者更轻松地同时构建、发布多个 NPM 包&#xff0c;即将多个包或项目放到一个大仓库下管理。 仅需一次 NPM 安装 仅需一步&#xff0c;Rush 便可以将你项目的所有依赖安装到一个公共文件夹下&#xff0c;该文件夹并不像 “package.json” 一样位于项…...

算法分析与设计复习__递归方程与分治

总结自&#xff1a;【算法设计与分析】期末考试突击课_哔哩哔哩_bilibili 1.递归&#xff0c;递归方程 1.1递归条件: 1.一个问题的解可以分解为几个子问题的解&#xff1b; 2.这个问题与分解之后的子问题&#xff0c;除了数据规模不同&#xff0c;求解思路完全一样; 3.存在…...

apk-parse包信息解析

最近公司做项目&#xff0c;需要解析apk包的基本信息&#xff0c;上网找了好多资料&#xff0c;最终决定使用apk-parse。 .yml文件 引入jar包 <dependency> <groupId>net.dongliu</groupId> <artifactId>apk-parser</artifactId> <version&…...

AI绘画进阶工具ComfyUI 傻瓜整合包安装教程!模型共享,一键安装!

哈喽大家好&#xff0c;今天给大家分享一下AI绘画工具Stable Diffusion的另一种UI界面&#xff0c;常见的有&#xff1a; 窗口式界面的WebUI 节点式工作流的ComfyUI ComfyUI更加进阶一些&#xff0c;是一个节点式工作流的AI绘画界面&#xff0c;它高度可定制、自定义编辑Ai生…...

无人机摄影测量数据处理、三维建模及在土方量计算

原文链接&#xff1a;无人机摄影测量数据处理、三维建模及在土方量计算https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247603776&idx2&snd96440e116900a46a71c45ff77316896&chksmfa8217a7cdf59eb15da39dd6366378b98ca39b9c836b76a473ff292b67ee37a6ff6…...

大模型平台后端开发(xiaomi)

文章目录 算法题 算法题 1 三数之和 &#xff08;注意去重的边界条件&#xff0c;过几天再刷几次&#xff09; 2 长度最小的子数组 (代码随想录题目&#xff0c;滑动窗口) 3 用链表实现栈 package mainimport ("errors""fmt" )// Node 定义链表节点 type…...

OpenHarmony驱动开发实战:手把手教你点亮一块MIPI DSI屏幕(Hi3516DV300平台)

OpenHarmony驱动开发实战&#xff1a;Hi3516DV300平台MIPI DSI屏幕点亮全流程解析 当一块全新的MIPI DSI屏幕交到嵌入式开发者手中时&#xff0c;从电路连接到最终点亮显示&#xff0c;中间需要跨越硬件接口适配、驱动参数配置、时序调试等多重技术关卡。本文将基于Hi3516DV300…...

别再只用Arduino了!用ESP32+TSW-30浑浊度传感器做个智能鱼缸水质监测器(附完整代码)

ESP32TSW-30浑浊度传感器打造智能鱼缸水质监测系统 养鱼爱好者都知道&#xff0c;水质是鱼类健康生长的关键因素。传统的人工检测方式不仅费时费力&#xff0c;还难以做到实时监控。今天我们就来动手打造一个基于ESP32和TSW-30浑浊度传感器的智能鱼缸水质监测系统&#xff0c;让…...

uniapp学习9,同时兼容h5和微信小程序的百度地图组件

H5端微信小程序端&#xff1a;manifest.json配置 "mp-weixin" : {"appid" : "你的微信小程序appid","setting" : {"urlCheck" : false},"usingComponents" : true,"permission": {"scope.userLoca…...

基于FireRedASR-AED-L与AIGC技术:自动生成语音错误分析报告

基于FireRedASR-AED-L与AIGC技术&#xff1a;自动生成语音错误分析报告 想象一下这个场景&#xff1a;你的团队刚刚完成了一轮大规模的语音识别系统测试&#xff0c;收集了上千小时的音频数据。接下来&#xff0c;你需要从海量的识别结果中&#xff0c;找出哪些词识别错了&…...

Qwen3.5-9B功能体验:支持128K长文本,打造你的专属AI知识库

Qwen3.5-9B功能体验&#xff1a;支持128K长文本&#xff0c;打造你的专属AI知识库 1. 开篇&#xff1a;认识Qwen3.5-9B的强大能力 Qwen3.5-9B是阿里云推出的90亿参数开源大语言模型&#xff0c;在多模态理解和长文本处理方面表现出色。作为开发者&#xff0c;我最感兴趣的是它…...

5个效率倍增技巧:ColorWanted如何解决设计师与开发者的颜色管理难题

5个效率倍增技巧&#xff1a;ColorWanted如何解决设计师与开发者的颜色管理难题 【免费下载链接】ColorWanted Screen color picker for Windows (Windows 上的屏幕取色器) 项目地址: https://gitcode.com/gh_mirrors/co/ColorWanted 在数字设计与开发工作中&#xff0c…...

学历作为硬实力:当代中国权力结构中知识资本的制度化逻辑与社会地位再生产机制

学历作为硬实力&#xff1a;当代中国权力结构中知识资本的制度化逻辑与社会地位再生产机制 作者&#xff1a;培风图南以星河揽胜 专栏链接&#xff1a;澄心观道 字数&#xff1a;约 14,200 字 | 阅读时长&#xff1a;约 52 分钟 引言&#xff1a;一个被广泛观察却少有深究的社会…...

CMake 导言

为什么选择 CMake 在掌握 Linux 基础后&#xff0c;我们知道一个项目通常由多个源文件组成。想要构建这个项目&#xff0c;就需要按照一定的规则对源文件进行编译和链接&#xff0c;而这些规则通常需要在 Makefile 中定义。 但随着项目体量增大&#xff0c;手写 Makefile 会变得…...

新手入门:零基础借助快马生成你的第一个openmaic网页版调用程序

今天想和大家分享一个特别适合新手入门的实践项目——如何借助InsCode(快马)平台快速生成你的第一个openmaic网页版调用程序。作为一个刚接触AI开发的新手&#xff0c;我最初看到各种API文档和代码示例时也是一头雾水&#xff0c;但通过这个可视化工具&#xff0c;居然半小时就…...

魔兽争霸3终极优化指南:如何解锁180fps帧率限制并解决现代硬件兼容性问题

魔兽争霸3终极优化指南&#xff1a;如何解锁180fps帧率限制并解决现代硬件兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经…...