《C语言》预处理

文章目录

    • 一、预定义符号
    • 二、#define定义常量
    • 三、#define定义宏
    • 四、宏更函数的对比
    • 五、#和##
        • 1、#运算符
        • 2、##运算符

一、预定义符号

C语言设置了一些预定义符号,可以直接使用,在预处理期间进行处理的。

__FILE__//进行编译的源文件
__LINE__//文件当前的行号
__DATE__//文件被编译的日期
__TIME__//文件被编译的时间
__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义

测试结果:
在这里插入图片描述

二、#define定义常量

#define 用来定义常量时的定义的写法:

#define MAX 100

逻辑规则是帮后面代码中出现MAX直接替换成100,这个操作步骤是在预处理阶段完成的,一般在用#define定义常量时的名称用大写书写。

使用场景:
在这里插入图片描述

三、#define定义宏

#define用来定义宏时使用方法跟函数差不多,但逻辑是替换,在替换时要将变量都用括号括起来,以免发生操作符的优先级问题造成不是我们期望的结果。
使用方式:

#define MAX(x,y) ((x) > (y) ? (x) : (y))

这是写了一个完成判断两数直接较大值的宏,注意宏名称后面括号要紧贴宏。

使用用例:
在这里插入图片描述
在这里插入图片描述

通过上面两个案例可以发现宏在传参时没有限制类型,如果函数了话,函数的返回类型是固定的,宏的运行速度更快。

四、宏更函数的对比

宏的优势:

  • 1.在完成代码量小的计算时,宏的工作时间要比函数小。
  • 2.更重要的是函数的参数必须声明特定的类型。而宏可以适用于各种类型可以用>来比较的类型。宏的类型无关的。

宏的劣势:

    1. 每次使⽤宏的时候,⼀份宏定义的代码将插到程序中。除⾮宏⽐较短,否则可能⼤幅度增加程序的⻓度。
    1. 宏是没法调试的。
    1. 宏由于类型⽆关,也就不够严谨。
    1. 宏可能会带来运算符优先级的问题,导致程容易出现错。

宏和函数的对比表:

属性#define定义的宏函数
代码长度每次使用时,宏都会被插入到程序中。除了非常小的宏之外,程序的长度会大幅度增长函数代码只出现在一个地方;每次使用时,都调用那个地方的同一份代码
执行速度更快存在函数的调用和返回的额外开销,速度慢一些
操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否则邻近操作符的优先级可能会产生不可预料的后果,所以建议宏在书写的时候多些括号。函数参数只在函数调用的时候求结果值传递给函数。表达式的求值可预测。
有副作用的参数参数可能被替换到宏体中的多个位置,如果宏的参数被多次计算,带有副作用的参数求值可能会产生不可预料的结果。函数参数只在传参的时候求值易控制。
参数类型宏的参数与类型无关,只要对参数的操作是合法的,它就可以使用于任何参数类型。函数的参数是与类型有关的,如不同,就需要不同的函数,任务是不同的。
调试宏是不方便调试的函数是可以逐语句调试的
递归宏是不能递归的宏是不能递归的

五、#和##

1、#运算符

#运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带参数的宏的替换列表中。
#运算符所执⾏的操作可以理解为”字符串化“。

使用例子:
在这里插入图片描述

2、##运算符

##可以把位于它两边的符号合成⼀个符号,它允许宏定义从分离的⽂本⽚段创建标识符。为记号粘合
这样的连接必须产⽣⼀个合法的标识符。否则其结果就是未定义的。这⾥我们想想,写⼀个函数求2个数的较⼤值的时候,不同的数据类型就得写不同的函数。

使用例子:
在这里插入图片描述

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

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

相关文章

在网站存在漏洞的情况下强化安全防御

一、引言 网络安全是一个持续的战斗,尤其是在网站存在已知或未知漏洞的情况下。本文将探讨如何在网站存在漏洞的情况下,采取有效措施进行安全防御。 二、理解漏洞 首先,我们需要理解网站的漏洞。这些可能包括SQL注入、跨站脚本&#xff08…

【数据结构与算法】插入排序

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​

深入Laravel服务容器:构建灵活应用的秘诀

标题:深入Laravel服务容器:构建灵活应用的秘诀 Laravel框架的服务容器是一个强大的工具,它负责管理类的依赖关系和执行依赖注入(DI)。服务容器是Laravel依赖注入系统的核心,使得应用组件之间的耦合度降低&…

一周速递|全球车联网产业动态(2024年7月7日)

政策法规 1、7月5日,工业和信息化部部长金壮龙在新闻发布会上表示,新兴产业要培育壮大。对新材料、人工智能、智能网联新能源汽车、新型储能、氢能、生物制造、商业航天、低空经济等新兴产业,要继续用好国内大市场和丰富应用场景&#xff0c…

人工智能、机器学习、神经网络、深度学习和卷积神经网络的概念和关系

人工智能(Artificial Intelligence,缩写为AI)--又称为机器智能,是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组成部分,它企图了解智能的实质…

【问题解决】 pyocd 报错 No USB backend found 的解决方法

pyocd 报错 No USB backend found 的解决方法 本文记录了我在Windows 10系统上遇到的pyocd命令执行报错——No USB backend found 的分析过程和解决方法。遇到类似问题的朋友可以直接参考最后的解决方法,向了解问题发送原因的可以查看原因分析部分。 文章目录 pyoc…

排序-java(插入排序和选择排序)

一,分类 主要的排序大致分为以下几类: 1,插入排序,又分为直接插入排序和希尔排序 2,选择排序,又分为选择排序和堆排序 3,交换排序,又分为冒泡排序和快速排序 4,归并…

springboot配置扫描生效顺序

文章目录 举例分析项目结构如下noddles-user-backend 两个配置文件noddles-user-job 配置文件noddles-user-server 配置文件问题:server和Job启动时对应加载的数据库配置为哪一个? 总结 在微服务架构中,backend模块会定义一个基础的配置文件,…

Report Design Analysis报告之logic level详解

目录 一、前言 二、Logic Level distribution 2.1 logic level配置 2.2 Logic Level Distribution报告 2.3 Logic Level 报告详情查看 2.4 Route Distributions 报告详情查看 2.5 示例代码 一、前言 ​在工程设计中,如果需要了解路径的逻辑级数,可…

CentOS7安装部署Anaconda

文章目录 CentOS7安装部署Anaconda一、前言1.组件2.环境 二、正文1.下载安装脚本2.安装Anaconda3.常用指令 CentOS7安装部署Anaconda 一、前言 1.组件 Anaconda 开源的Anaconda个人版 (正式为Anaconda发行版)是在Linux,Windows和Mac OS X上…

卷积神经网络基础篇

文章目录 1、卷积层1.1、激活函数1.3、sigmoid1.4、Tanh1.5、ReLU1.6、Leaky ReLU1.7、误差计算 2、池化层3、全连接层4、CNN训练 参考链接1 参考链接2 1、卷积层 卷积层(Convolutional layer),这一层就是卷积神经网络最重要的一个层次&…

动手学深度学习(Pytorch版)代码实践 -循环神经网络- 56门控循环单元(`GRU`)

56门控循环单元(GRU) 我们讨论了如何在循环神经网络中计算梯度, 以及矩阵连续乘积可以导致梯度消失或梯度爆炸的问题。 下面我们简单思考一下这种梯度异常在实践中的意义: 我们可能会遇到这样的情况:早期观测值对预测…

机器人动力学模型及其线性化阻抗控制模型

机器人动力学模型 机器人动力学模型描述了机器人的运动与所受力和力矩之间的关系。这个模型考虑了机器人的质量、惯性、关节摩擦、重力等多种因素,用于预测和解释机器人在给定输入下的动态行为。动力学模型是设计机器人控制器的基础,它可以帮助我们理解…

html的浮动作用详解

HTML中的“浮动”(Float)是一个CSS布局技术,它原本设计用于文本环绕图像或实现简单的布局效果,比如并排排列元素。然而,随着Web开发的演进,浮动也被广泛用于更复杂的页面布局设计中,尽管现代CSS…

2024/7/7周报

文章目录 摘要Abstract文献阅读题目问题本文贡献问题描述图神经网络Framework实验数据集实验结果 深度学习MAGNN模型相关代码GNN为什么要用GNN?GNN面临挑战 总结 摘要 本周阅读了一篇用于多变量时间序列预测的多尺度自适应图神经网络的文章,多变量时间序…

SAP已下发EWM的交货单修改下发状态

此种情况针对EWM未接收到ERP交货单时,可以使用此程序将ERP交货单调整为未分配状态,在进行调整数据后,然后使用VL06I(启用自动下发EWM配置,则在交货单修改保存后会立即下发EWM)重新下发EWM系统。 操作步骤如…

3ds Max渲染曝光过度怎么办?

3dmax效果图云渲染平台——渲染100 以3ds Max 2025、VR 6.2、CR 11.2等最新版本为基础,兼容fp、acescg等常用插件,同时LUT滤镜等参数也得到了同步支持。 注册填邀请码【7788】可领30元礼包和免费渲染券哦~ 遇到3ds Max渲染过程中曝光过度的问题&#xf…

SLF4J的介绍与使用(有logback和log4j2的具体实现案例)

目录 1.日志门面的介绍 常见的日志门面 : 常见的日志实现: 日志门面和日志实现的关系: 2.SLF4J 的介绍 业务场景(问题): SLF4J的作用 SLF4J 的基本介绍 日志框架的绑定(重点&#xff09…

Influxdb中,Flux常用的函数

目录 一、Flux常用的函数及其简要描述 1. 数据源和筛选函数 2. 聚合函数 3. 时间序列操作函数 4. 转换和映射函数 5. 窗口函数 6. 其他常用函数 注意事项 二、使用方法举例 1. 数据源和筛选 2. 聚合 3. 时间序列操作 4. 窗口函数 5. 转换和映射 注意事项 三、…

跨越界限的温柔坚守

跨越界限的温柔坚守 —— 郑乃馨与男友的甜蜜抉择在这个光怪陆离、瞬息万变的娱乐圈里,每一段恋情像是夜空中划过的流星,璀璨短暂。然而,当“郑乃馨与男友甜蜜约会”的消息再次跃入公众视野,它不仅仅是一段简单的爱情故事&#xf…