深挖C语言:编译与预处理
目录1. 翻译环境和运行环境1.1 翻译环境1.2 预处理预编译1.3 编译1.3.1 词法分析1.3.2 语法分析1.3.3 语义分析1.4 汇编1.5 链接2. 运行环境1. 翻译环境和运行环境在 ANSI C的任何一种现实中存在两个不同的环境。第一种翻译环境在这个环境中源代码被转换为可执行的机器指令二进制指令。第二种执行环境这个环境用于实际执行代码。1.1 翻译环境翻译环境分几个阶段阶段做什么在C语言里对应工具1. 预处理处理#include、#define、条件编译把头文件内容插入到源文件预处理2. 编译把预处理后的代码变成汇编代码 .s 文件编译器3. 汇编把汇编代码编程机器指令 .o 或 .obj 文件目标文件汇编器4. 链接把多个目标文件 库文件合并成应该可执行程序链接器绘图如下注1.多个 .c 文件单独经过编译器编译处理生成对应的目标文件。2.在Windows环境下的目标文件后缀是 .objLinux环境下目标文件的后缀是 .o3.多个目标文件和链接库一起经过链接器处理生成最终的可执行程序。4.链接库是指运行时库支持程序运行的基本函数合集或者第三方库。再把编译器展开成三个过程绘图如下1.2 预处理预编译在预处理阶段源文件和头文件会被处理为 .i 为后缀的文件。在gcc环境下对 test.c 文件预处理后的 .i 文件命令如下gcc -E test.c -o test.i预处理阶段主要处理那些源文件中 #开始的预编译指令。如#include、#define处理的规则如下1.将所有的 #define 删除并展开所有的宏定义。2.处理所有条件编译指令如#if、#ifdef、#elif、#else、#endif。3.处理 #include 预编译指令将包含的头文件的内容插入到该预编译指令的位置这个过程是递归进行的也就是说被包含的头文件也可能包含其他文件。4.删除所有注释。5.添加行号和文件标识方便后续编译器生成调试信息等。6.保留所有的#pragma的编译器指令编译器后续会使用。经过预处理后的 .i 文件中不再包含宏定义因为宏已经被展开了。并且包含的头文件都被插入到 .i 文件中所有当我们无法知道宏定义或者头文件是否包含正确的时候可以查看预处理后的 .i 文件来确认。1.3 编译编译过程就是将预处理后的文件进行一系列的词法分析、语法分析、语义分析及其优化生成相应的汇编代码文件。编译过程指令如下gcc -S test.i -o test.s假设对下面代码进行编译会怎么处理呢array[index] (index4)*(26);1.3.1 词法分析当源代码程序被输入到扫描器中扫描器的任务就是简单的进行词法分析把代码中的字符分割成一系列的记号关键字、标识符、字面量、特殊符号等如下记号类型array标识符[左方括号index标识符]右方括号赋值(左圆括号index标识符加号4数字)右圆括号*乘号(左圆括号2数字加号6数字)右圆括号1.3.2 语法分析接下来进入语法分析器将对扫描产生的记号进行语法分析从而产生语法树这些语法树是以表达式为节点的树。1.3.3 语义分析由语义分析器来完成语义分析即对表达式的语法层面分析。编译器将分析的是语义的静态分析。静态语义分析通常包括声明和类型匹配类型的转换等。这个阶段会报告错误的语法信息。1.4 汇编汇编器是将汇编代码转变成机器可执行的指令二进制指令每一个汇编语句几乎都对应一条机器指令。就是根据汇编指令和机器指令的对照表一一的进行翻译不做指令优化。汇编命令如下gcc -c test.s -o test.o1.5 链接链接是一个复杂的过程凯娜姐的时候需要把一堆文件链接在一起才可生产可执行程序。链接的过程包括地址和空间分配服啊后决议和重定位等这些步骤。链接解决的是一个项目中多文件、多模块之间相互调用的问题。例如在一个C的项目中有两个 .c 文件test.c 和 add.c代码如下test.c #include stdio.h //test.c //声明外部函数 extern int Add(int x, int y); //声明外部的全局变量 extern int g_val; int main() { int a 10; int b 20; int sum Add(a, b); printf(%d\n, sum); return 0; }Add.c :int g_val 2022; int Add(int x, int y) { return xy; }我们已经知道每个源文件都是单独经过编译器处理生成对应的目标文件。test.c经过编译器处理生成test.oadd.c经过编译器处理生成add.o我们在test.c的文件中使用了add.c 文件中的Add函数和g_val变量。我们在test.c 文件中每⼀次使用Add函数和g_val的时候必须确切的知道Add和g_val的地 址但是由于每个文件是单独编译的在编译器编译 test.c的时候并不知道Add函数和g_val 变量的地址所以暂时把调用 Add的指令的目标地址和g_val的地址搁置。等待最后链接的时候由链接器根据引用的符号 Add在其他模块中查找Add函数的地址然后将test.c中所有引用到 Add 的指令重新修正让他们的目标地址为真正的Add函数的地址对于全局变量g_val也是类似的方法来修正地址。这个地址修正的过程也被叫做重定位。2. 运行环境1.程序必须载入内存中在有操作系统的环境中一般这个由操作系统来完成。在独立的环境中程序的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成。2.程序一执行就开始接着调用main函数。3.开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack)存储函数的局部变量和返回地址。程序同时也可以使用静态内存存储在静态内存中的变量在程序的整个执行过程一直保留它们的值。4.终止程序正常终止main函数也有可能是意味终止。最后感谢你的阅读欢迎交流与指正。

相关新闻

AI智能体社区设计:从脚本互动到持久记忆关系的架构演进

AI智能体社区设计:从脚本互动到持久记忆关系的架构演进

1. 项目概述:从单向脚本到双向持久,AI智能体社区的范式跃迁最近在捣鼓AI智能体(AI Agent)的社区构建时,我反复琢磨一个现象:为什么很多早期的、基于预设脚本(Scripts)运行的AI社区&a…

2026/8/21 7:19:43 阅读更多 →
单片机毕业设计-基于 STM32 与 ESP-01S 的车载远程安防监测系统设计 基于 STM32 的车辆震动防盗与温湿度采集系统设计(010704)

单片机毕业设计-基于 STM32 与 ESP-01S 的车载远程安防监测系统设计 基于 STM32 的车辆震动防盗与温湿度采集系统设计(010704)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/21 7:19:43 阅读更多 →
【保姆级教程!】SCI一作投稿全流程指南,从选刊到接收只需这几步?

【保姆级教程!】SCI一作投稿全流程指南,从选刊到接收只需这几步?

还在为SCI投稿焦虑吗?从选刊迷茫到被拒稿的崩溃,这条路你还要走多久? 这份《SCI一作投稿全流指南》是一份极具实操性的科研发表攻略。 文章以时间轴为线索,系统梳理了从投稿前准备、正式投稿、初审等待、同行评审到最终修回的全…

2026/8/21 7:19:43 阅读更多 →

最新新闻

Figma可动人偶开箱测评:武装JK D2夏服与配件包深度解析

Figma可动人偶开箱测评:武装JK D2夏服与配件包深度解析

这次我们来看一个关于Figma可动人偶的开箱测评项目。项目标题是“【Figma】Little Amory 武装JK D2夏服开箱测评以及配件包开箱”。这并非一个软件或AI模型,而是一个实体手办模型的开箱与评测内容。对于模型玩具爱好者、收藏家,或是刚接触Figma系列产品的…

2026/8/21 10:03:37 阅读更多 →
Linux桌面应用崩溃弹窗配置:drkonqi与systemd-coredump实战指南

Linux桌面应用崩溃弹窗配置:drkonqi与systemd-coredump实战指南

这次我们来看一个 Linux 桌面环境下的“Bug”修复。这个 Bug 有点特别:它不是一个导致系统崩溃或数据丢失的严重错误,而是一个“功能缺失”——Linux 桌面在应用程序崩溃时,没有像 Windows 那样直观的“应用程序错误”弹窗。对于习惯了 Windo…

2026/8/21 10:03:37 阅读更多 →
Sandbox-Native智能体的分支策略优化:让AI在模拟世界中学会“动手”

Sandbox-Native智能体的分支策略优化:让AI在模拟世界中学会“动手”

1. 从“沙盒”到“智能体”:一个被忽视的工程化瓶颈 最近在折腾一个多智能体协作的项目,核心想法挺简单:让几个基于大语言模型的智能体在一个模拟环境(我们内部戏称为“沙盒”)里,通过互相沟通和试错&#…

2026/8/21 10:03:37 阅读更多 →
OpenClaw小龙虾保姆级安装教程Windows「文档整理」

OpenClaw小龙虾保姆级安装教程Windows「文档整理」

前置环境及注意事项: 1.1 环境 node.js 环境配置git 安装 openclaw: Node.js v22.19 is required (current: v22.18.0).If you use nvm, run: nvm install 22 nvm use 22 nvm alias default 22 此情况需要升级 node 环境的版本 升级后,建议重新安装…

2026/8/21 10:03:37 阅读更多 →
秋叶ComfyUI中文整合包:开箱即用的AI绘画节点工作流解决方案

秋叶ComfyUI中文整合包:开箱即用的AI绘画节点工作流解决方案

这次我们来看一个对本地AI绘画工作流玩家非常重要的项目:秋叶大佬制作的ComfyUI全界面中文整合包。如果你一直觉得ComfyUI的节点式操作虽然强大但英文界面门槛太高,或者被繁琐的环境配置、插件依赖劝退,那么这个整合包就是为你准备的。它最大…

2026/8/21 10:02:36 阅读更多 →
忆笙CRM客户管理系统到底能管什么,14大模块以及20+AI功能一次看懂

忆笙CRM客户管理系统到底能管什么,14大模块以及20+AI功能一次看懂

文章目录 一、一套系统,覆盖客户全生命周期二、核心亮点是「AI 增强」三、审批不用等 IT,自己就能配四、手机上也能用,老板随时看全局五、大模型不绑死你六、一次买断,长期使用,数据还在自己手里七、老板常问的几个问题…

2026/8/21 10:02:36 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →