【C语言】宏定义
🚩 WRITE IN FRONT🚩
- 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四"🔎
- 🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大博主、华为云享专家、阿里云专家博主、掘金优秀创作者、全网粉丝量6w+、全网访问量100w+🏅
- 🆔 本文章内容由 謓泽 原创 如需相关转载请提前告知博主 ⚠
- 📝 个人主页:謓泽的博客📃
- 📣 专栏系列:【C】系列 📃
- 🧑💻 Gitee:謓泽 (wsxsx) - Gitee.com⭐️
- 🎁 点赞👍+ 收藏⭐️+ 留言📝
目录
🍑宏定义不带参数
🍈优点
🍑定义宏
🍈说明
🍈命名事项
🍻字符串宏常量
🍈practice[练习]
🍻#undef
🍑宏定义不带参数
说明:宏定义指令的 #define 用来定义一个标识符和一个字符串,我们可以以这个标识符来表示这个字符串,在程序当中每次遇到该标识符的时候就用来所定义的字符串来进行替换它。宏定义的作用相当于给指定的字符串起了一个别名。
不带参数的宏的定义方式如下(这也是我们经常用到的宏定义)
#define 宏名 字符串 //没有分号,说没有分号倒不如说最好不要加分号
这里说下原因吧:因为宏定义它并不是C语言的语句,所以不用加分号。
- 表示这是一条预处理命令。
- 宏名实际上就是一个标识符,必须要符合C语言当中标识符的语法规定的。
标识符的规则:字母、数字、下划线,不以数字开头,注意:关键字不能作为标识符!预定义标识符有define、printf、scanf 它们是可以作为标识符的。
- 字符可以是常数、表达式 以及 格式字符串符等。
#define Num 1000
说明:上述代码的作用就是该程序中用Mum来替代1000,在编译预处理的时候,每当代码在源程序中遇到Mum就自动的用1000来进行代替。
注意:宏名要简单且定义的明确,一般习惯会用大写字母来去表示,来区分和变量的区别。
🍈优点
- 方便程序的修改,不用对整个程序进行修改,只需对宏定义上进行修改。
- 提高程序的运行效率,更加方便模块化。
🍑定义宏
#define 机制包括了一个规则,允许把参数替换到文本当中去,这种实现操作通常被称之为是宏(macro) 或者是 定义宏(define macro)
带参数的宏定义方式如下格式↓
#define 宏名(参数表)字符串
那么光说是不行的,我们就用宏定义来实现两个数字的相加。代码示例如下👇
#define _CRT_SECURE_NO_WARNINGS 1 #define ADD(x,y) x+y #include<stdio.h> int main(void) {printf("相加的值:%d\n",ADD(5, 5));return 0; }
运行结果🖊
相加的值:10
上述代码的意思是我们先调用宏也就是宏调用,把宏里面的值传递给宏名当中的参数表,然后再传过去的参数表替换到字符串的文本当中去。
注意:宏的参数是先完成替换的,不是先计算然后再进行传参的。如下代码所示↓
#define _CRT_SECURE_NO_WARNINGS 1 #define S(x) x*x #include<stdio.h> int main(void) {printf("相加的值:%d\n",S(3+1));return 0; }
我一开始的时候看到这个代码以为是16,4*4不就是16吗。实际上我想错了。
它的工作原理是这个样子的,这里3+1就是宏的参数,那么就会把3+1传递到宏的参数当中去。那么这个时候替换完成之后就是:3+1 * 3+1,这不就是7吗。没错(@^0^)
一句话总结:参数会经过任何的计算直接传入进去。
实际上我们想要得到4*4的一个结果实际上这也很容易,把字符串文本修改下即可。
#define S(x) (x)*(x)
当然这还是不够严谨,完美再加一个小括号再外面。
#define S(x) ((x)*(x))
()YYDS!那么这个概念性的东西就说到这里,具体还是要多上手打下代码去进行实践。
那么接下来我们再举出一个例子,看大家能不能做对。(╹ڡ╹ )
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define M(x) (x)+(x) int main(void) {printf("%d ", 10 * M(2));return 0; }
🍎注意⇢上述这两个代码是不一样的仔细看看哟😛
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define M(x) (x)+(x) int main(void) {int a = 2;printf("%d ", 10 * M(a));return 0; }
注意⇢上述这两个代码是等价的,变量也是可以传入到参数表当中去的。
选出上述代码正确的值不能 一共四个选项如下↓
A:40
B:22
C:88
D:10
可能有些人会选择A这个选项,因为 10 * 2 = 20 然后,20+20 = 40,但实际上这是错误的和上面所犯的错误都是一模一样的。
printf("%d",10 * (2) + (2));
原型如上代码所示↑
那我们想要得到 40 的值就必须要加小括号。如下形式↓
#define M(x) ((x)+(x))
其实这也无非就是操作符的优先级大小,切记(✿◕‿◕✿)
🍈说明
宏参数和#define的定义中可以出现其他的#define定义的变量。但是对于宏,是不能出现递归的。
当预处理搜索#define定义的符号的时候,字符串常量的内容并不被搜索。
在使用函数的时候我们需要注意它的数据类型,但是在宏当中我们是不需要注意的,想是整形就是整形想是浮点型就是浮点型。说明用宏在这里是更加灵活的只是处理简单问题上切记。
🍈命名事项
相信有些小伙伴已经发现了这个函数的宏的使用语法和函数是非常类似滴。所以语言本身就会没办法帮我们区分二者的一些使用。那么我们平时写宏或者函数的时候的习惯是↓
- 宏明全部大写形式。
- 函数明不要全部大写,建议第一个字母大写。
🍻字符串宏常量
#include<stdio.h> #define Name chenze int main(void) {printf("%s",Name);return 0; }
(error)字符串没有带双引号编译器会直接报错✘
(correvt)正确写法是要在宏字符串带上双引号✔
#define Name "chenze"
小知识点⇢宏是可以用来充当注释的效果的这个我在接触宏的时候我都没有想到这个问题,那么现在我们用BSC充当C++的风格注释。大家可以尝试去试一下这里我就不再演示了(@^0^)
🍈practice[练习]
那么经过上述的知识点相信各位已经熟悉的差不多了接下来我们来做一道题目来练习practice以下吧。
题目内容⇢用宏实现整形变量(a)和整形变量(b)把原来的值用宏实现清0并且打印原来(a,b)没有被宏清0之前的值。示例代码如下👇
#include<stdio.h> #define empty0(a,b) a = 0;b = 0; int main(void) {int a = 20;int b = 10;printf("before:%d %d\n", a, b);empty0(a, b);printf("after :%d %d\n", a, b);return 0; }
运行结果🖊
before:20 10
after :0 0
✔说明⇢上述结果当中我们可以知道变量(a)和变量(b)通过宏被修改成为了0的值。
✔拓展⇢用do...while(0)语句结构可以在宏插入多条语句的结构因为有花括号{}在。
🍻#undef
#undef 是为取消定义,用于移除一个宏的定义。
格式形式如下
#undef NAME
如果现在的一共名字需要被重新定义的话,那么旧名字就会被移除。
🍏如下代码所示
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define NUM 10 int main(void) { #undef NUMprintf("num of:%d\n",NUM); }
运行结果⇥error(错误)
说明⇢上述代码原本是要打印NUM宏定义的值的,但是由于我们使用了#undef取消宏定义了。此时编译器就相当于未定义标识符NUM了说的简单点相当于不存在了,注:是在取消宏定义之后的语句当中的。
🍎拓展知识点⇥宏可以在任意地方使用。
#include<stdio.h> int main(void) {printf("num of 1:%d\n", 10); #define M 20printf("num of 2:%d\n", M);return 0; }
运行结果🖊
num of 1:10 num of 2:20
🍏说明⇢在上述代码当中可以证明宏在源文件的任何地方宏都可以定义。宏的作用范围:从定义出开始往后它都是有效的。
相关文章:
【C语言】宏定义
🚩 WRITE IN FRONT🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四"🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大博…...
库存三层模型概述
库存分层 (1)电商库存体系分为三层:销售层、调度层、仓库层。 库存三层模型:销售库存,调度层属于订单领域-履约。实物库存属于库存领域 WMS的库存跟调度层是一致的。 但是销售库存跟调度层可能不一致,因为…...
SNERT预备队招新CTF体验赛-Web(SWCTF)
目录 1、F12 2、robots 3、game1-喂青蛙 4、game 2 - flap bird 5、game 3 - Clash 6、Get&Post 7、sql (1)手工注入 (2)工具注入 8、命令执行漏洞 9、文件上传漏洞 10、文件泄露 11、php反序列化漏洞 12、PHP绕…...
OpenGLES:绘制一个彩色、旋转的3D圆柱
一.概述 上一篇博文讲解了怎么绘制一个彩色旋转的立方体 这一篇讲解怎么绘制一个彩色旋转的圆柱 圆柱的顶点创建主要基于2D圆进行扩展,与立方体没有相似之处 圆柱绘制的关键点就是将圆柱拆解成:两个Z坐标不为0的圆 一个长方形的圆柱面 绘制2D圆的…...
【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明
在智能驾驶中,DDS有可能被广泛使用,因此推出这篇说明教程。 1、基于【QT开发(5)】教程的项目文档进行开发 2、安装DDS 查看《【eProsima Fast DDS(1)】安装eProsima Fast DDS》 至少安装: foonathan_m…...
js 判断字符串中是否包含某个字符串
方法一(推荐使用): indexOf() indexOf() 方法:返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。 var str "LiHeErNAN"; console.log(str.indexOf("A") ! -1 ); // true方法二:m…...
部署在阿里云ECS服务器上的微服务项目中获取到的时间和windows的时间不一样的问题
继上一篇文章《阿里云ECS服务器无法发送邮件问题解决方案》之后,又发现登录的时候发送邮件中的时间和自己windows上的时间不一样,大概找了一下原因,是LocaDateTime使用的时区不一样导致的远程服务器和本机时间不一致。 只需要在LocaDateTime…...
怎么通过portainer部署一个vue项目
这篇文章分享一下今天通过docker打包vue项目,并使用打包的镜像在portainer上部署运行,参考了vue-cli和docker的官方文档。 首先,阅读vue-cli关于docker部署的说明 vue-cli关于docker部署的说明https://cli.vuejs.org/guide/deployment.html#…...
Springboot实现websocket(连接前jwt验证token)
背景 用户连接服务器weksocket前,需经过jwt的token验证(token中包含账号信息),验证合法后,才可以于服务器正常交互。 实现 一、配置依赖(pom.xml) <!-- websocket --><dependency&g…...
2023/10/3
平荒尽处是春山 二零二三年的十月 似乎已经过去了很久很久 没有了曾经的意气风发 也没有了歌伴夜声 之前一直不知道自己为什么喜欢打篮球 虽然打得不好 但是今天突然明白了 我喜欢的不是过人后的喜悦 而是篮球应声入网的清脆的声音 当然 出来进球 还有的是擦筐而出和三不沾 但是…...
zemax场曲/畸变图与网格畸变图
网格畸变是XY两个方向上的几何畸变,是不同视场实际像高与近轴像高的偏差。 垂轴放大率在整个视场范围内不能保持常数 当一个有畸变的光学系统对一个方形的网状物体成像时,若δy>0,则主光线的交点高度y比理想像高y低,视场越大,低得越多&a…...
【小尘送书-第六期】《巧用ChatGPT轻松玩转新媒体运营》AI赋能运营全流程,帮你弯道超车、轻松攀登运营之巅
大家好,我是小尘,欢迎你的关注!大家可以一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 👨💻博主主页:小尘要自信 …...
GD32F10 串口通信
1. 什么是通信 通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递,从广义上指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法,任意媒质,将信息从某方准确安全地传送到另方。通信双方如果想正确传输…...
QT常用控件介绍
QT信号与槽机制 connect (A,SIGNLA(aaa()),B, SLOT(bbb())); GUI继承简介 布局管理器 垂直布局水平布局网格布局表单布局 输出控件 Label: 标签Text Browser: 文本浏览器Graphics View : 图形视图框架Calendar Widget: 日历控件LCD Number: 液晶字体数…...
[FineReport]安装与使用(连接Hive3.1.2)
一、安装(对应hive3.1.2) 注:服务器的和本地的要同时安装。本地是测试环境,服务器的是生产环境 1、服务器安装 1、下载 免费下载FineReport - FineReport报表官网 向下滑找到 2、解压 [rootck1 /home/data_warehouse/software]# tar -zxvf tomcat…...
黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)
参考文章1:https://www.bilibili.com/video/BV1Kr4y1i7ru/ 参考文章2:https://dhc.pythonanywhere.com/article/public/1/ 文章目录 基础篇数据库相关概念(数据库DataBase(DB)、数据库管理系统DataBase Management Sy…...
最新AI智能创作系统源码V2.6.2/AI绘画系统/支持GPT联网提问/支持Prompt应用
一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图…...
神器 CodeWhisperer
这两天看到了好多关于 Amazon CodeWhisperer 针对个人用户终身免费使用的消息,便抽空简单来重点介绍下如何在 VS Code 这款 IDE 上安装和使用 CodeWhisperer。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视…...
GraphQL全面深度讲解
目录 一、GraphQL 是什么 二、GraphQL 规范 数据模型 字段 参数 三、运行示例 四、优势和劣势 优势 劣势 一、GraphQL 是什么 GraphQL 是一种用于 API 的查询语言,也是一个基于服务端的运行引擎。 GraphQL 提供了一套完整的规范和描述用于查询 API…...
9.1 链表
链表:数据结构,一堆数据的集合,链表的每一项都是结构体,都使用指针指向下一个结构体。 数组的缺点:由于数组的地址是连续的,对数组的数据进行增、删、改后数据不连续,需要较大的运算量才能实现…...
分布式文件系统FastDFS实战
1. 分布式文件系统应用场景 互联网海量非结构化数据的存储需求: 电商网站:海量商品图片视频网站:海量视频文件网盘:海量文件社交网站:海量图片 2.FastDFS介绍 https://github.com/happyfish100/fastdfs 2.1简介 …...
手机自动直播系统源码交付与代理加盟注意事项解析!
随着直播行业的不断发展,手机自动直播已经成为了人们生活中不可或缺的一部分。手机无人直播软件成了香饽饽,各类手机实景直播APP大批量涌现。因为创业和技术门槛低,市场需求高,所以成了最火热创业赛道。那么如果是不懂技术的人群&…...
NodeJS 如何连接 MongoDB
初始化: yarn init使用命令: yarn add mongodb新建 index.js 文件: const MongoClient require(mongodb).MongoClient; const db_name "fly_articleDb"; const url mongodb://127.0.0.1:27017;(async function () {const cli…...
基于Java的老年人体检管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
燃气安全如何保障?万宾燃气管网监测系统时刻感知管网运行态势
近年来随着我国城镇化建设的加快,燃气已经成为每个家庭的必需品。然而,每年夏季频繁发生的燃气爆炸事故,已经严重危害人民生命财产安全危害社会公共安全和公共利益。为了保障燃气安全运行,近日,许多城市都在大力推进燃…...
2. selenium学习
Selenium 学习 简介 Selenium 是一个用于自动化浏览器的工具,它提供了多种编程语言的支持,包括 Python、Java、C# 等。它可以模拟用户在浏览器中的操作,比如点击按钮、填写表单、提交数据等。Selenium 具有强大的功能和灵活的定制性&#x…...
数学建模Matlab之评价类方法
大部分方法来自于http://t.csdnimg.cn/P5zOD 层次分析法 层次分析法(Analytic Hierarchy Process, AHP)是一种结构决策的定量方法,主要用于处理复杂问题的决策分析。它将问题分解为目标、准则和方案等不同层次,通过成对比较和计算…...
json能够存储图片吗?
JSON 本身并不适合存储图片,因为它是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON 数据格式简单,只包含键值对,因此它主要用于存储和传输文本数据。 然而,你可以将图片转换为 …...
C语言中自定义类型讲解
前言:C语言中拥有三种自定义类型,这三种自定义类型是怎么运用呢?在内存中又是怎么存储的呢?通过这篇文章我们来逐个讲解讲解。 三种类型分别是: 1.结构体 – 通俗的来讲就是可以把不同类型的变量放在一个集合中 2.枚举…...
Win10系统中GPU深度学习环境配置记录
运行环境 系统:Win10 处理器 Intel(R) Core(TM) i7-9700K CPU 3.60GHz 3.60 GHz 机带 RAM 16.0 GB 设备 ID A18D4ED3-8CA1-4DC6-A6EF-04A33043A5EF 产品 ID 00342-35285-64508-AAOEM 系统类型 64 位操作系统, 基于 x64 的处理器 显卡:NVIDIA GeF…...
与狗做网站/企业微信管理系统
Windows下如何使用CMD命令打开进入MySQL数据库?1.打开【开始】》【运行】输入【cmd】单击【确定】后出现CMD命令黑色窗口,这就是我们说的CMD命令行,或者使用快捷键Windows键(在键盘上有个Windows标志的按键)R输入cmd后回车。2.在CMD命令窗口敲入命令mys…...
苏州优化网站排名/网络营销服务公司
在keil中编程时,写了一行代码,然后就想知道,执行这句C代码需要多长时间。时钟周期在这就不解释了,频率的倒数。指令周期,个人理解就是cpu执行一条汇编指令所需要的时间。我们知道cm3使用的三级流水线,那么到…...
云南定制化网站建设/seopeix
题意: 用n个木棒凑成数字,和最大是多少 思路: 直接dp写。 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #include<iostream>typedef long long ll; using namespace std; const…...
网站建设首页突出什么/看广告赚钱的平台
/*********************************************************************** Buildroot stress-ng Linux系统压力测试* 说明:* 之前有使用lmbench对整板进行一些测试,如果相对某一部分专门进行测试,* 就可以参考使用stree-ng…...
郑州 高端网站建设/镇江推广公司
多层感知机解决了之前无法模拟异或逻辑的缺陷,同时更多的层数也让网络更能够刻画现实世界中的复杂情形。理论上而言,参数越多的模型复杂度越高,“容量”也就越大,也就意味着它能完成更复杂的学习任务。多层感知机给我们带来的启示…...
医疗网站前置审批要多长时间/推广平台app
正则表达式的分组及在pandas中的实用操作1. 正则表达式分组1.1 分组的模式1.2 分组的实际操作1.2.1 邮箱号码匹配1.2.2 标签信息匹配2. pandas中的应用操作2.1 导入库,读取文件数据,并输出指定的字段2.2 提取数据,创建新字段3. 小结之前的博客…...