程序环境和预处理

news2024/10/3 8:30:54

文章目录

  • 1.程序的翻译环境和执行环境
  • 2.详解编译 + 链接
    • 2.1 翻译环境
    • 2.3 运行环境
  • 3.预处理详解
    • 3.1 预定义符号
    • 3.2 #define
    • 3.3 宏和函数对比
  • 3.4 #undef
    • 3.5 条件编译

1.程序的翻译环境和执行环境

在ANSI C的任何一种实现中,存在两个不同的环境。
第一种是翻译环境,在这个环境中源代码被翻译成可执行的机器指令。
第二种是执行环境,在这个环境中执行代码。

它们的关系如图所示
在这里插入图片描述

2.详解编译 + 链接

2.1 翻译环境

在这里插入图片描述

一个工程中存在多个源文件,每个源文件都是单独经过编译器处理之后生成一个目标文件(.obj文件)。
当生成多个目标文件之后,链接器会把多个目标文件和链接库链接在一起,生成可执行程序(.exe文件)

翻译过程如图
在这里插入图片描述
预处理阶段完成的事情

  1. 完成了头文件的包含
  2. #define定义的符号的替换
  3. 注释的删除

编译阶段完成的事情
把C语言代码转化为汇编代码

  1. 语法分析
  2. 词法分析
  3. 语义分析
  4. 符号汇总

汇编阶段完成的事情
把汇编代码转换为机器指令(二进制指令)

2.3 运行环境

  1. 程序必须载入内存中。在有操作系统的环境中,程序的载入由这个操作系统来完成。在独立的环境中,程序的载入必须由手工安排,也可以通过可执行代码置入只读内存来完成。
  2. 程序的执行开始,接着便调用main函数。
  3. 开始执行程序代码。这时程序会使用一个运行的堆栈(stack),用来保存函数的局部变量和返回值。同时程序也可以使用静态(static)内存,保存在静态内存中的变量的值在整个程序的执行过程中都不能改变。
  4. 终止程序。正常终止main函数,也有可能是异常终止。

3.预处理详解

3.1 预定义符号

在这里插入图片描述

3.2 #define

#define是定义符号的
在这里插入图片描述

如何将参数插入到字符串中?

这里两个双引号和一个双引号的作用是相同的。
在这里插入图片描述

如图所示,每次打印都要有printf很麻烦,有没有好点的方法?
在这里插入图片描述
可以用宏来实现,这里用到的原理是:当宏参数为字符串时它才可以插入到字符串中,而#可以把一个宏参数变成对应的字符串。
在这里插入图片描述

还可以再优化一下,使得传入什么类型的数据都可以
在这里插入图片描述
注:#不能单独用在字符串中,只能配合宏定义一起使用

##的作用:
将两个符号合成一个符号
在这里插入图片描述

3.3 宏和函数对比

宏的优点:

  1. 宏比函数在规模和速度上更省一筹
  2. 宏是类型无关的,而函数只能在相应的类型上使用。
  3. 宏的参数可以出现类型,而函数做不到。

宏的缺点

  1. 每次使用宏的时候,一份宏定义的代码插入到程序中,除非宏比较短,除非大幅度增加代码的长度。
  2. 宏不可调试
  3. 宏由于类型无关,也不可调试
  4. 宏可能带来运算符优先级的问题,导致容易出错

两者对比

  1. 代码长度: 每次使用宏时,宏代码都被插入到程序中,除非特别小的宏,否则程序的长度会大幅度增长。函数代码在同一个地方,每次调用函数,都使用同一个地方的同一份代码。
  2. 执行速度: 宏的执行速度较快。函数存在调用和返回的额外浪费,所以速度较慢。
  3. 操作符优先级: 宏使用在有表达式的上下文中,如果不加括号,可能会因为操作符的优先级而出现不可预料的结果,所以建议在使用宏时多加括号。函数的参数只在传参时计算一次,结果更稳定。
  4. 带副作用的参数: 宏参数可能被替换到宏体内的多个部分,如果参数带有副作用,可能产生不可预料的结果。函数参数的副作用只在传参时计算一次,易于预测结果
  5. 参数类型: 宏没有特定的参数类型,只要后续操作是合法的,那么就可以传入任何类型的参数。函数的参数类型是特定的,参数类型不一样,就需要使用不同的函数。
  6. 调试: 宏不可以调试。函数是可以逐语句调试的。
  7. 递归: 宏没有递归。函数有递归。

3.4 #undef

用于取消宏定义
在这里插入图片描述

3.5 条件编译

在编译一个程序的时候我们要将一个语句(一组语句)编译或者放弃是很方便的,因为我们有条件编译指令。

比如说:调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译。

在这里插入图片描述
如果将PRINT定义为任意数字都可以打印
在这里插入图片描述
在这里插入图片描述

常见的条件编译指令:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

AlexNet网络详解

目录:AlexNet网络详解一、背景二、模型结构三、网络的参数配置四、每一层作详细的分析一、背景 2012年,Alex Krizhevsky等人在多伦多大学的实验室设计出了一个深层的卷积神经网络AlexNet,夺得了2012年ImageNet LSVRC的冠军,且准确…

Redis学习(1)—— 下载、安装、启动服务、连接redis服务

Redis是基于内存的数据结构存储系统,可以作为数据库、缓存、任务队列、消息队列、分布式锁 Redis是key-value数据库,非关系型数据库 一. Windows 1. 下载 下载地址:https://github.com/microsoftarchive/redis/releases 2. 安装 直接…

UNet - unet网络

目录 1. u-net介绍 2. u-net网络结构 3. u-net 网络搭建 3.1 DoubleConv 3.2 Down 下采样 3.3 Up 上采样 3.4 网络输出 3.5 UNet 网络 UNet 网络 forward 前向传播 3.6 网络的参数 4. 完整代码 1. u-net介绍 Unet网络是医学图像分割领域常用的分割网络&#xff0…

软件测试找bug小技巧总结,从初级跨入中级测试......

目录:导读前言一、必备知识二、定位技巧三、常用小技巧方法1、分析问题场景进行预判2、关注请求体的状态码3、关注请求的入参与响应数据4、查看日志5、经验法则四、总结前言 测试工作 测试的过程就是一个寻找影响产品功能和用户体验bug的过程,测试人员发…

C++之多态详解

文章目录前言一、多态的概念概念二、多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写3.1多态条件探究(1)多态条件探究一:不符合重写 -- virtual函数(2)多态条件探究二:不符合重写 -- 不是父类的指针或者引用调用(3)多态条件探究三:不符合重写 -- 参数不同(4)多态条件探…

Vue3 - ref 基本类型(通俗易懂,详细教程)

简介 它是 Vue3 提供的一个用于创建基本数据类型的函数,能将普通的数据包装为响应式。 大白话说,就是咱们要创建一个响应式变量,需要通过这玩意才行! 回忆 Vue2 不理解没关系啊,我们先来回顾一下 Vue2 中是如何做到的…

MaxViT: Multi-Axis Vision Transformer

论文:https://arxiv.org/abs/2204.01697 代码地址:https://github.com/google-research/maxvit 在本文中,介绍了一种高效且可扩展的注意力模型,称之为多轴注意力,该模型由两个方面组成:分块的局部注意力和…

开源作品:引流宝!集活码、短网址等功能为一体的工具!致力于提高引流效率,减少资源流失!

前言 开发这款工具的初衷是为了辅助自己的工作,提供自己日常工作的效率,自己使用了一段时间下来觉得很有用,于是完善之后开源。如今已经开源近2年,第一个版本是在2020年9月份开源,收获了390个star,后来持续…

用ue4怎么制作一个物体故障闪烁的特效

这是一篇关于电子标牌出现故障时可以使用的毛刺效应的文章。本文将其分解为两个简单的效果,将使用 GIF 来解释它们。 噪音效果 第一个组合是噪音效果。 在 Component Mask 中指定 G 矢量并在 Sine 和 Ceil 中调整 G 值。要将线条更改为水平移动,请在 …

操作系统4小时速成:操作系统的基本概念,它是系统软件,管理处理机、存储器、io设备、文件,并发和共享是最基本特征,还有虚拟和异步

操作系统4小时速成:操作系统的基本概念,它是系统软件,管理处理机、存储器、io设备、文件,并发和共享是最基本特征,还有虚拟和异步 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招…

二叉树的存储结构

引言: 对于二叉树的存储,我们可以采取顺序存储和链式存储结构 顺序存储结构 ● 按编号次序存储节点 • 对树中每个节点进行编号 • 其编号从小到大的顺序就是节点在连续存储单元的先后次序。 我们是从编号为1开始,为了保持数组位序和编号保持…

EMS Advanced Data Import高级数据导入选项Crack版

EMS Advanced Data Import高级数据导入选项Crack版 EMS Advanced Data Import是Dolphi和CBuilder应用。允许您一次以著名的MS Excel、MS Access、DBF、XML、TXT、CSV、ODF和HTML格式输入数据文件。 EMS高级数据导入选项: 导入流行格式信息:S Excel 97-20…

什么是shuffle?shuffle的原理及过程

目录 一、什么是shuffle 二、为什么要引入shuffle,有哪些影响 三、shuffle的工作原理 1、shuffle的阶段 2、shuffle的中间文件 3、Shuffle Write 4、Shuffle Read 四、总结回顾 一、什么是shuffle 类比分公司的人与物和 Spark 的相关概念是这样对应的&#…

同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好?

同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好? UE VS U3D 技术策略上 U3D技术策略是很保守的,发出来的featurelist测试覆盖率无可非议,开发者无需多少新功能的熟悉测试成本。 UE4的技术策略是激进的,发出来的fea…

嵌入式开发学习之--点亮LED灯(上)

在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的“hello world”,是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事: 1.开发环境没问题,包括软件,硬件都没问题。 2.能…

电脑重装系统前怎么备份,重装系统怎么备份数据

有很多用户想把操作系统升级成为Win11的,但是又不知道怎么备份原来的数据,担心升级操作系统后,电脑中的重要数据全部丢失了。电脑重装系统前怎么备份?”这里小编就给我们详细介绍一下吧! 一、升级Windows 11系统要不要…

梯度多云管理技术架构的优势

随着云计算模式的日渐成熟,作为私有云和公有云的混合形态,混合云迎来了爆发期。在混合云的建设过程中,多云管理能力成为关键,梯度多云管理平台是多云时代下的服务管理利器。梯度多云管理平台是对多个公有云、私有云及各种异构资源…

视频声音怎么翻译?这几个办法教你实现视频声音翻译成中文

现如今刷视频已经成为我们的日常生活中不可缺少的一部分了,例如有时我们看到一些有用的教学视频,可能会想要把这些视频保存下来,但有些视频却都是英文的,有些小伙伴可能英语基础不好,查看起来不方便,这个时…

MySQL运算符

算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加()、减(-)、乘(*)、除(/)和取模(%&#…

【math】Hiden Markov Model 隐马尔可夫模型了解

文章目录Introduction to Hidden Markov ModelIntroductionMarkov chainHidden Markov Model(HMM)Three QuestionsQ1: evaluate problem -- Forward algorithmQ2: decode problem -- Viterbi algorithmQ3: learn problem -- Baum-Welch algorithmApplicationIntroduction to Hi…