#define定义宏

#define的定义范围

 

#define不光可以定义变量,常量,还可以定义几乎所有的东西,因为#define可以定义一串代码(即宏),所以包含在代码中的东西都能被定义。

 


#define定义宏



定义是宏名必须于它的参数括号紧挨,中间不能有任何符号,空格都不行。

宏中传参的时候是直接把传进去的参数直接替换,而不是先计算表达式再传参。

所以如果你的参数只有一个,但你却传了一个表达式,他会把这个表达式直接替换进去,这个时候如果不加括号,肯定就会出现错误。

ee5d1d0bb9424b339a195a9a7a5472a9.png 

 因为*的优先级大于+,所以他得到的结果不是36,而是11。

 

此时加上括号就可以解决

即   square(x) (X)*(X)

 

其实光给X打括号还不够安全

4c4302319efa4fc2953ad8a4e175270d.png

我们想要的来是,3传进去得到6,6在与10相乘得到60

 

但其实实际得到的结果是33。

 

此时如果在在两个x的后打一个包括两个X的括号,就可以解决。

即   square(x)((X)*(X))

 

所以为了安全,尽量给宏的参数和整个宏的内容都打上括号。

 


#define替换规则



1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。

 

2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。

 

3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。

 

宏参数和#define定义中可以出现其他#define定义的符号。

但是对于宏,不能递归。

当预处理器搜索#define定义的符号的时候,字符串中的内容并不被搜索和改变

 


宏的内容中的#的作用



的作用是,放在参数的前面

可以将传进来的参数变成对应的字符串。

 

例   假设传进去的参数是abcd,如果你在宏的内容中的参数前加了#,他就会被修改为"abcd"


宏中的##的作用



将##两边的符号合成一个符号,但是合成之后的符号必须是定义过的

例:如果宏中有sum##a,在执行程序的时候,sum##就相当于suma被使用

 

##也可以放在宏参数和宏参数之间或者宏参数和符号之间

4554b832d54e430e9c093d13b3601ab1.png

 


带副作用的宏参数



当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。

 

e9ce7892d5e14a64ab0d04c61f1c8cdb.png

 上图的宏参数传了a++和b++,传入了MAX后的代码相当于106行写的代码。

 

可以看到a和b都在宏中被多次赋值,得到的结果,可能不是我们想要的结果。

 

而且宏不像函数传值调用时函数调用结束后不改变实参,


宏调用之后不管你是传值还是传地址,传入的参数只要在宏中改变了,宏调用结束后,实参也会被改变。


所以MAX调用结束后m的值为6,a的值为7,b的值为5

所以使用宏时参数尽量不要使用有副作用的参数。

 


宏对于函数的优缺点


优点:

1.因为宏是在预处理的时候就编译了,运行的时候不用再编译,只需要执行计算就可以,所以用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。

 

2.更为重要的是函数的参数必须声明为特定的类型,而宏不用

所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型等可以用于>来比较的类型。

 

缺点:

1.每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。

2.宏是没法调试的。

3.宏由于类型无关,也就不够严谨。

4.宏可能会带来运算符优先级的问题,导致程容易出现错。

5、宏不能递归。

 

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

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

相关文章

校园跑腿小程序源码系统:取快递+寄快递+食堂超市跑腿 带完整的搭建教程

现如今,越来越多的校园生活服务需求涌现出来。为了满足学生们的日常需求,校园跑腿小程序应运而生。这款小程序集成了取快递、寄快递、食堂超市跑腿等功能,为学生们提供了一个方便、快捷的生活服务平台。 以下是部分代码的示例: 系…

使用RFC跳过权限校验的方法

1、业务背景 由于业务流程的复杂性,用户往往只具备部分功能的权限,导致在操作自开发程序时出现权限问题。例如前台限制了用户对销售订单的修改,而自开发功能中又涉及单据修改,此时一味限制权限,则无法正常使用功能。 2…

API 开放平台项目(已整理,已废弃)

项目大纲 前端 React 18Ant Design Pro 5.x 脚手架Ant Design & Procomponents 组件库Umi 4 前端框架OpenAPI 前端代码生成 后端 Java Spring BootMySQL 数据库MyBatis-Plus 及 MyBatis X 自动生成API 签名认证(Http 调用)Spring Boot Starter&#…

L1-070:吃火锅

以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。 本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。 输入格式&#xff…

nestjs入门教程系列(三):动态路由到底该怎么用

如何获取前端请求中的参数 引子 我们在处理前端发送过来的请求时,需要访问客户端的request信息,那么我们该怎么操作呢?由于nestjs提供对底层平台的访问即express,所以我们可以通过注入的方式来方位请求对象 TIPS:需要从nestjs/common包里…

旅行旅游研学线路景点门票特产周边小程序开源版开发

旅行旅游研学线路景点门票特产周边小程序开源版开发 以下是旅行旅游研学线路景点门票特产周边小程序开源版开发的功能列表: 首页: 展示热门线路和推荐景点信息提供搜索功能,用户可以通过关键词搜索线路、景点、特产等显示当前位置和附近的景…

wish店铺的审核周期是多久?wish排名规则是什么?-站斧浏览器

wish店铺的审核周期是多久? 在开设新的Wish店铺或者新增产品时,Wish会对店铺和产品进行审核,确保它们符合平台的规定和要求。然而,Wish并没有明确说明店铺审核的具体周期,审核时间会因各种因素而有所不同。 1.新店铺…

SEM扫描电镜成像质量影响因素

本文介绍影响扫描电镜图像质量的因素及其对图像质量的影响,分别从加速电压、扫描速度和信噪比、束斑直径、探针电流、消像散校正、工作距离以及反差对比等分析图像质量的变化原因,提出提高图像质量的方法。 扫描电子显微镜是(Scanning El…

LangChain(0.0.340)官方文档十一:Agents之Agent Types

LangChain官网、LangChain官方文档 、langchain Github、langchain API文档、llm-universe《Agent Types》、《Examples using AgentType》 文章目录 一、快速入门1.1 概念1.2 基本示例1.2.1 配置LangSmith1.2.2 使用LCEL语法创建Agents1.2.3 使用自定义runtime执行1.2.4 使用A…

哪种猫粮比较好?超能打的5款主食冻干测评

不知道从什么时候开始掀起一股冻干喂养风,各种查资料阅读文献发现冻干喂养是最适合忙碌地打工人的“生骨肉喂养”替代版,是最符合猫咪饮食天性的一种。很多养猫人纷纷开始冻干喂养,但对于主食冻干猫粮的选择就让很多猫奴犯了难在电商平台随便…

AMR在机械行业中的运用十分广泛,提高了生产效率和降低了人力成本

随着智能制造和工业4.0的发展,AMR在机械行业中的运用十分广泛,成为推动机械行业智能化和自动化的重要技术装备之一。AMR的出现在很大程度上改变了传统的人工搬运方式,提高了生产效率和降低了人力成本。 在机械行业中,富唯智能AMR…

Arduino串口发送接收和串口中断事件

目录 一、硬件介绍 1、控制器 2、TTL转USB串口 二、软件程序 1、单片机发送字符串 (1)每个串口对应的类名称介绍 (2)发送功能 (3)代码 (4)测试 2、单片机接收字符串 &…

elasticsearch系列七:聚合查询

概述 今天咱们来看下es中的聚合查询,在es中聚合查询分为三大类bucket、metrics、pipeline,每一大类下又有十几种小类,咱们各举例集中,有兴许的同学可以参考官网:https://www.elastic.co/guide/en/elasticsearch/refere…

闲来无事互相翻包,来看看我们的2023通勤EDC

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 EDC,Every Day Carry,顾名思义就是每天包里装的东西。 什么?难道除了…

idea的pom.xml文件灰色删除线解决办法

以上是点击了移除module后就变成这样 如果再次对着已移除的module右键会发现有个delete,点击这个是真删了,要谨慎备份哦 解决方案:恢复误操作remove module的解决方法 idea最右边,有个Maven控件,找到要恢复的module&a…

ssm基于vue的大学生社团管理系统的设计与实现+vue论文

基于vue的大学生社团管理系统的设计与实现 计算机科学与技术 2022届 姓名 学号 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。传统的大学生社团信息管理模式,采用人工登…

java-MyBatis项目配置

java-MyBatis项目配置 最近博主在学习MyBatis,学习了一下MyBatis项目配置。 下面博主就讲一下这个项目配置的一个情况 先看一下配置流程大纲: 后续,我会解释一下这些配置文件的意义 1.创建一个maven项目,为什么要创建这个项目&…

在markdown中添加视频的两种方法

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 方式一源代码: 方式二结尾语网络的梦想 markd…

Qt篇——QwtPainter::drawPie绘制扇形

QwtPainter::drawPie(QPainter *painter, const QRectF &rect, int startAngle, int angle); 一、参数含义: painter: 重绘函数中的painter对象 rect: 要绘制扇形的圆的外切矩形。 startAngle: 要绘制的扇形的起始角 …

Scala知识点——App类

我们在代码中一般程序都是是通过main方法进入。但是在scala中提供了一个App类,通过继承可以实现不用显式的调用main方法就能运行。 App类中实现了main方法: