当前位置: 首页 > 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…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...