C语言程序环境与预处理回顾总结

news2025/1/11 22:38:03

大概讲解与铺垫

  1. 首先,什么叫c语言的源代码?也就是我自己写的.c文件里面的代码,这个就叫做源代码。
  2. 然后需要知道的是计算机他只认识二进制,因此他只能接收与执行二进制指令。也就是可执行的机器指令。
  3. 然后我们必须得知道,实际上存在着翻译环境与执行环境。在这两种不同的环境之下,会执行不同的操作。
  4. 翻译环境里面干的操作就是把我写的源码转化为计算机能看懂的二进制指令,也就是可执行的机器指令,然后执行环境里面就是实际执行代码。
  5. 我们这边着重去探讨一下翻译环境下的细节。源码转化为计算机能够识别的机器指令就是依赖于翻译环境,换句话来说,翻译环境实际上就是把test.c文件经过一系列处理变成test.exe文件(我知道.exe就是可执行程序,实际上都已经是人是看不懂的,但计算机倒是能看懂的一些二进制指令)
  6. 像我们使用的VS 2019被称为集成开发环境,里面自然就集成了编译环境与执行环境与一体。
  7. 在这里插入图片描述
  8. 在这里插入图片描述
  9. 如图:在翻译环境下,分为两个部分,就是编译加链接。然后编译又分为三个部分:预处理,编译,汇编。在这三个部分当中新的test.c文件会分别变为test.i,test.s,test.obj,然后汇编执行完之后进行链接,完了之后变为test.exe。对于不同的源文件经过编译器互相互独立,单独进行编译会单独生成一个又一个.obj目标文件,然后这些各自相互独立生成的目标文件在经过链接器会统一生成一个可执行程序。这可执行程序里面就是可执行的机器指令。这就是整个翻译环境下的大概过程。

翻译环境之编译之预处理

  1. 先是翻译环境下的编译下的第一个阶段预处理,当然在现阶段各个.c文件都是各自相互独立的进行的。预处理完系统不会默认生成,但你可以通过gcc命令去生成一个xxx.i文件.
  2. 在这个预处理阶段主要干一些什么事呢?就是删除注释啊,处理预处理指令啊。处理预定义符号啊等等。其中这个预处理指令就包括#include, #define定义的常量与宏等,你会发现其实都是一些文本操作,比如替换与删除。其实没有啥本质意义。再次强调一遍:注意都是一些文本操作,比如切换与删除。这个预处理阶段没有啥高级的。

翻译环境之编译之编译

  1. 接下来就是编译阶段,这个阶段完成之后gcc会默认自动生成xxx.s文件.
  2. 这一步实际上是在干什么呢?就是把c语言被预处理之后的代码翻译成汇编代码。当然里面的细节更是繁多。
  3. 尤其需要注意一下这个符号汇总所谓的这个符号就是具有全局性质的变量名与函数名。然后把他们给汇总记录一下。

翻译环境之编译之汇编

  1. 接下来就进入汇编阶段,gcc会默认自动生成xxx.obj文件/xxx.o文件,也就是目标文件。
  2. 当生成该文件的时候,这个文件里面已经是二进制指令了,直接打开也打不开的,需要借助于readelf,当然具体的细节就不讲了
  3. 反正这个汇编阶段相当于就是把汇编代码给他划分为一个一个段,然后转换为二进制指令。当然具体细节非常多。
  4. 有一个需要特别注意,就是形成符号表。就是说把你之前汇总的符号再加上对应的地址怎么合起来就形成了一个符号表。
  5. 上面的这些编译过程(预处理,编译,汇编)都是各个.c文件编译器当中各自完全独立而走一遍,生成了各自的.obj目标文件。

翻译环境之链接

  1. 接下来就是链接阶段,这个阶段主要分为两个步骤,一个是合并段表,一个是符号表的合并与重定位。
  2. 因为我们知道在汇编阶段,把汇编代码首先分成一个一个的段,然后给它转为二进制指令。那这边就先把之前相互独立的obj文件里面的各自的段全部整合在一起。这个就是合并段表。
  3. 符号表的合并与重定位就是把之前互相独立的编译过程中产生的各自的符号表也整合在一起。这时候之前的符号表的作用就体现出来了嘛,在链接的时候,我就需要通过符号表去查找地址处。然后之前生成的随机地址的话,就用正确的地址给他替代掉。如果说找不到相应的内容,那就会报错。

执行环境

  1. 接下来就是执行环境,执行环境的话必须得载入到内存当中去进行。然后函数栈帧的开辟啦,什么啦,什么啦等等。

关于预处理阶段等的回顾与补充

  1. 还是要回过头来对预处理阶段进行一个回顾,预处理阶段主要是用来删除注释,处理预定义符号,处理预处理指令,一般都是一些文本操作,比如说删除与替换。
  2. 这些预定义符号都是语言本身内置的。
    在这里插入图片描述
    在这里插入图片描述
  3. #define 的核心其实就是替换。注意,在字符串当中是不搜索进去的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb——tomcat(安装使用)

目录 WEB服务器-Tomcat 服务器概述 Web服务器 Tomcat Tomcat下载 安装与卸载 启动与关闭 WEB服务器-Tomcat 服务器概述 服务器硬件: 指的也是计算机,只不过服务器要比我们日常使用的计算机大很多。 服务器,也称伺服器。是提供计算服务…

【数据结构】第十一站:链式二叉树

目录 一、二叉树的创建 二、二叉树的遍历 1.前序中序后序遍历 2.层序遍历 三、二叉树的节点个数以及高度等 四、二叉树的构建和销毁 五、DFS和BFS 一、二叉树的创建 为了方便后面的讨论,我们在这里先手撕一颗二叉树 typedef int BTDateType; typedef struct …

Qt Designer

Qt Designer——即Qt设计师,是QT项目开发的可视化图形界面编辑器,通过设计师可以很方便地创建图像界面文件*.ui,然后将ui文件应用的源代码中,做到所见即所得,让界面的设计变得十分简单。下面介绍Qt Designer的简单使用…

使用PowerShell自动部署ASP.NetCore程序到IIS

asp.net core 安装asp.net core sdk https://dotnet.microsoft.com/en-us/download/dotnet/3.1 创建asp.net core项目 dotnet new webapi运行项目 访问https://localhost:5001/WeatherForecast iis配置 安装iis 以管理员身份运行powershell Enable-WindowsOptiona…

【计算机网络】学习笔记:第二章 物理层(五千字详细配图)【王道考研】

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

Windows中Seata连接Linux中的nacos的配置

目录 前言&#xff1a; Seata配置教程&#xff1a; file.conf: ​编辑 配置代码&#xff1a; registry.conf: ​编辑 nacos-config.sh: config.txt: 前言&#xff1a; 许多博主&#xff0c;把两个软件都安装在同一个系统中&#xff0c;但是有些人估计是装在不同的环境下…

支付系统设计:收银台设计二

文章目录 前言1. 接口校验1.1 Chains1.2 Checker1.2.1 AbstractChecker1.2.2 TokenChecker1.2.3 OrderChecker1.2.4 UserInfoChecker1.2.5 BaseInfoChecker1.2.6 SignChecker 1.3 ApiFilter 2. 下单3. 收银台首页2.1 OrderInfoResolver2.2 UserBaseInfoResolver 4. 执行流程总结…

企业宁愿花 15K 重新招人,也不愿意花 10K 留住老测试员?

金三银四即将进入尾声&#xff0c;大家逐渐收敛了跳槽涨薪的想法&#xff0c;准备收收心等待过年。不置可否&#xff0c;年后必定又是一波跳槽季&#xff0c;通过跳槽才能涨薪已经成为了不少求职者内心默认的定理。 不知道什么时候开始&#xff0c;公司不能满足加薪的要求&…

leetcode 812. 最大三角形面积

题目 给你一个由 X-Y 平面上的点组成的数组 points &#xff0c;其中 points[i] [xi, yi] 。从其中取任意三个不同的点组成三角形&#xff0c;返回能组成的最大三角形的面积。与真实值误差在 10-5 内的答案将会视为正确答案。 示例 1&#xff1a; 输入&#xff1a;points [[…

手把手带你实现通讯录C语言

通讯录大家都很熟悉了&#xff0c;一个联系人包括姓名&#xff0c;年龄&#xff0c;性别&#xff0c;电话&#xff0c;地址等&#xff1b; 那我们想一想我们所学的数据类型&#xff08;int,float,double等都是单一的相同类型 &#xff08;属于内置类型&#xff09;&#xff09;…

#详细介绍!!! 造成死锁的原因以及解决方案!

本篇主要是介绍什么是死锁&#xff0c;已经死锁产生的原因&#xff0c;如果避免死锁。根据上述的几个问题让我们来阅读本篇文章。 目录 1. 什么是死锁 2. 形成死锁的原因&#xff08;四个必要条件&#xff09; 3. 如果有效避免死锁 1. 什么是死锁 死锁主要是锁彼此间进行锁等…

FPGA实现JPEG-LS图像压缩,有损无损可配置,提供工程源码和技术支持

目录 1、前言2、JPEG-LS图像压缩理论3、JPEG-LS图像压缩性能介绍4、JPEG-LS图像压缩时序介绍5、JPEG-LS图像压缩输出压缩流6、工程源码和仿真7、福利&#xff1a;工程代码的获取 1、前言 JPEG-LS&#xff08;简称JLS&#xff09;是一种无损/有损的图像压缩算法&#xff0c;其无…

1 Go语言开发环境搭建详细教程【Go语言教程】

Go语言开发环境搭建【Win、Linux、Mac】 1 SDK下载 官网地址&#xff1a;golang.org,因为一些原因国内可能无法访问。可以使用下面第二个链接。国内地址访问&#xff1a;https://golang.google.cn/dl或者https://www.golangtc.com/download 根据自己操作系统版本&#xff0c;下…

30天学会《Streamlit》(9)

30天学会《Streamlit》是一项编码挑战&#xff0c;旨在帮助您开始构建Streamlit应用程序。特别是&#xff0c;您将能够&#xff1a; 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第9天 - …

超高精度PID控制器的特殊功能(4)——分程控制功能及其应用

摘要&#xff1a;分程控制作为一种典型的复杂控制方法之一&#xff0c;常用于聚合反应工艺、冷热循环浴、TEC半导体温度控制、动态平衡法的真空和压力控制等领域。为快速和便捷的使用分程控制&#xff0c;避免采用PLC时存在的控制精度差和使用门槛高等问题&#xff0c;本文介绍…

pyqt6+vtk

这里用PyQt6vtk9.2.6 pip install PyQt6 pyqt6-tools vtk这里拉了一个水平布局 然后水平布局中加入QWidget&#xff0c;object name改为vtkWidget 右键Promote Widgets Promoted class name: QVTKRenderWindowInteractor Header file: vtkmodules.qt.QVTKRenderWindowInterac…

文章改写神器在线-AI续写文章生成器

AI续写生成器 AI续写生成器是一种利用人工智能技术的创意工具&#xff0c;能够提高写作效率&#xff0c;为营销推广带来全新的可能性。无论你是写手、广告人员还是市场营销人员&#xff0c;这个工具都能够有效地解决你在写作中遇到的难题。 在内容创作行业中&#xff0c;原创…

Amazon Linux2部署安装Jenkins

先决条件 服务器配置要求 256 MB of RAM 1 GB of drive space (although 10 GB is a recommended minimum if running Jenkins as a Docker container) 需要部署安装JDK环境部署安装的Jenkins版本为Version 2.400 部署安装JDK 1. 下载JDK软件包 wget https://corretto.aws/…

Altium Designer借助嘉立创添加PCB封装和3D模型

目录 引言打开立创专业版EDA&#xff0c;建立项目从立创商城找到器件编码添加PCB封装导出和修改3D封装 引言 由于使用Altium Designer的频率并不是特别高&#xff0c;所以每一次使用总是得东跌西撞的才回忆起一些使用步骤。因此&#xff0c;想在这里记录一下Altium Designer借…