C语言大佬的必杀技---宏的高级用法
C语言大佬的必杀技—宏的高级用法
目录:
- 字符串化
- 标记的拼接
- 宏的嵌套
- 替换多条语句
- 防止一个文件被重复包含
- 宏和函数的区别
可能大家在学习的时候用得比较少,但是在一些代码量比较大的时候,这样使用,可以大大的提高代码的可读性,方便我们后期维护
1、字符串化 -------( 打印变量的值和格式化字符串 ):
#define test(x,format) printf(#x "= %" #format "\n", x)
说明 :
#x
在宏定义中被称为字符串化操作符,它将x
参数转换为一个字符串,并在代码中插入。"= %"
是一个字符串,用于指定输出的格式。#format
也是字符串化操作符,将format
参数转换为一个字符串,并在代码中插入。- 整个宏的作用就是 : 可以用于打印变量的值和格式化字符串。
代码演示:
#include<stdio.h>#define test(x,format) printf(#x "= %" #format "\n", x)int main() {const char* name = "wxf";test(name,s); //s 相当于 %sint i = 1;test(i, d); //d 相当于%dreturn 0;
}
结果显示:
2. 标记的拼接---------(将宏参数进行字符串化和连接操作) :
#define test(x,format) printf(#x "= %" #format "\n", x)#define test2(i) test(age ## i,d) //d 相当于%d 当然这里可以替换成其他的类型
说明:
在该宏的扩展部分,它将 age
和 i
进行连接操作(使用 ##
连接运算符),形成一个新的标识符,并作为参数传递给 test
宏。
代码演示:
#include<stdio.h>#define test(x,format) printf(#x "= %" #format "\n", x)
#define test2(i) test(age ## i,d) //d 相当于%d 当然这里可以替换成其他的类型int main() {int age1 = 21,age2=22;test2(1);test2(2);return 0;
}
结果显示:
3. 宏的嵌套 :
宏的嵌套是我们常用的 , 话不多说,我们直接看例子
#define F(f) f(args)
#define args a,b
说明: 第一个宏里面的f ,替换成f(args), 然后下一个宏,将args ,替换成 a, b 。两者嵌套
代码演示:
#define F(f) f(args)
#define args a,bvoid test3(int number1, int number2) {printf(" %d + %d= %d\n ", number1, number2 , number1+ number2 );
}int main() {int a = 21,b=22;F(test3);return 0;
}
结果显示:
4. 替换多条语句:
#define YUE_HUIU(name) do { \ printf("%s ,我们一起去看电影把!\n , name); \printf("%s, 我们一起去唱歌吧!\n ", name); \printf("%s, 我们一起回家吧!\n", name); \
}while (0);
注意: 使用了 do...while(0)
结构来创建一个匿名的代码块,目的是为了让宏展开后能够正常使用分号进行语句结束。这种技巧可以避免在使用宏时造成错误的语法解析。
代码演示:
/* '\' 表示续航符,表明这一行还没有结束 */#define YUE_HUIU(name) do { \ printf("%s ,我们一起去看电影把!\n , name); \printf("%s, 我们一起去唱歌吧!\n ", name); \printf("%s, 我们一起回家吧!\n", name); \
}while (0);int main() {YUE_HUI("wxf");return 0;
}
结果显示—(宏展开后的样子):
do { printf("%s ,我们一起去看电影把!\n , "wxf"); printf("%s,我们一起去唱歌吧!\n ", "wxf"); printf("%s, 我们一起回家吧!\n", "wxf"); } while (0);
5. 防止头文件被重复包含
这个用法还是经常会用到的 ,我们经常会使用到一些自己定义的 头文件
代码演示:
#ifndef _TOOLS_H /* tools.h 头文件的名称 */
#ifdef _TOOLS_H//头文件内容#endif // _TOOLS_H
6 . 宏和函数的区别
- 函数调用时,先求出实参表达式的值,然后带入形参, 带参数的宏只是进行简单的字符替换.
- 函数调用是在程序运行时处理,分配临时内存, 而宏展开(函函数),是在编译时进行的,展开时是不分配内存,也没有返回值,也没 有值传递.
- 宏的参数没有类型 ,只是一个符号 ,展开时带入到指定的字符串中.
- 使用宏的次数多时, 宏展开后源程序变长 ,函数调用不会使源程序变长.
- 宏替换只会占用编译时间 ,不会占用运行时间,而函数调用占用的是运行时间(分配内存 ,传递参数 ,执行函数体).
时进行的,展开时是不分配内存,也没有返回值,也没有值传递. - 宏的参数没有类型 ,只是一个符号 ,展开时带入到指定的字符串中.
- 使用宏的次数多时, 宏展开后源程序变长 ,函数调用不会使源程序变长.
- 宏替换只会占用编译时间 ,不会占用运行时间,而函数调用占用的是运行时间(分配内存 ,传递参数 ,执行函数体).
相关文章:

C语言大佬的必杀技---宏的高级用法
C语言大佬的必杀技—宏的高级用法 目录: 字符串化标记的拼接宏的嵌套替换多条语句防止一个文件被重复包含宏和函数的区别 可能大家在学习的时候用得比较少,但是在一些代码量比较大的时候,这样使用,可以大大的提高代码的可读性,…...
@Retryable和Guava retry
文章目录 一、spring的Retryable1.1 作用:1.2链接:https://www.cnblogs.com/EasonJim/p/7684649.html1.3 坑1.4 Recover补充依赖 二、Guava-retry:使用 一、spring的Retryable 1.1 作用: Retryable注解,被注解的方法…...

conda的安装和使用
参考资料: https://www.bilibili.com/read/cv8956636/?spm_id_from333.999.0.0 https://www.bilibili.com/video/BV1Mv411x775/?spm_id_from333.999.0.0&vd_source98d31d5c9db8c0021988f2c2c25a9620 目录 conda是啥以及作用conda的安装conda的启动conda的配置…...

K8S:pod集群调度及相关操作
文章目录 一.pod集群调度概念1.调度约束( List-Watch组件)2.List-Watch的工作机制(1)List-Watch的工作机制流程(2)List-Watch的工作机制图示 3.调度的过程(1)调度的任务(2)调度选择p…...

阿里云便宜服务器2核2G配置经济型e实例一年182元性能测评
阿里云服务器经济型e实例2核2G配置优惠价格182.04元一年,系统盘ESSD Entry盘20GB起,公网带宽默认按使用流量,也可以选择按固定带宽计费,带宽值从1M到100M可选,阿腾云分享阿里云服务器2核2G优惠价格、详细配置及e系列CP…...
资讯| 工信部拟筹建元宇宙标准化工作组;《权游》作者起诉OpenAI
元宇宙赛道 工信部:优先开展“元宇宙 工业制造”等行业应用标准研制 9月18日,工业和信息化部科技司就《工业和信息化部元宇宙标准化工作组筹建方案(征求意见稿)》(以下简称《方案》)公开征求意见。 工业…...

Win10安装Docker Desktop并运行Tutorial示例
背景 前段时间一个项目需要在开发环境直接使用 Docker ,为了省事便计划在本地安装 Desktop 版的 Docker 。其实安装过程比较简单,可视化安装即可,主要是对安装与初步使用时遇到的问题做个记录。 下载安装 下载地址:https://dow…...

1、靶机——Pinkys-Place v3(1)
文章目录 一、环境二、获取flag11、扫描局域网内存活主机1.1 查看kali的IP地址1.2 扫描存活主机 2、粗略扫描靶机端口(服务)3、寻找ftp服务漏洞4、扫描端口详细信息5、匿名登录ftp 一、环境 攻击机:kali 靶机:Pinkys-Place v3&am…...

【AIGC】Stable Diffusion Prompt 每日一练0916
一、前言 1.1 写在前面 本文是一个系列,有点类似随笔,每天一次更新,重点就Stable Diffusion Prompt进行专项训练,本文是第022篇《Stable Diffusion Prompt 每日一练0916》。上一篇《Stable Diffusion Prompt 每日一练0915》 1.…...

【C语言】指针经典笔试题(上)
C语言的一大重头戏就是指针。 对于指针有一些认识: 1.指针是存放变量的地址,一般说的指针和指针变量是一个概念。 2.地址的单位是字节,大小在不同编译器环境下有所不同,32位机器是4个字节,64位机器是8个字节。 3.数组名…...
缓存问题解决方案
《服务器开发技术、方法与实用解决方案》 一、缓存预热 在系统刚启动或活动刚开始时,如果缓存中没有数据,那么大量请求将直接访问数据库。如果瞬时访问流量巨大,则可能导致数据库因过载而宕机,甚至引发系统雪崩。因此需要将缓存…...
数据结构————寻路算法
(一)基础补充 二维数组 定义:基本概念与方法和一维数组相似,一般形式为:类型符 数组名[常量表达式][常量表达式]; 其中,数组长度只能是常量;通常把二维数组第一个下标理解成行,第二个下标为列,常量表达式: 表达式里面只有常量的式子(如数字类常量); 二维数组常…...

蓝桥杯 题库 简单 每日十题 day7
01 啤酒和饮料 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。我们还知道他买的啤酒比饮料的数量少,请你…...
go -- 获取当前24点的时间戳 --chatGpt
gpt: 要获取当前24点的时间戳,你可以使用 Go 标准库中的 time 包来实现。以下是一个示例函数,它可以获取当前日期的24点的时间戳: go package main import ( "fmt" "time" ) func getMidnightTimestamp() in…...
docker 容器内手动设置服务自启动
需求描述:不使用DockerFile实现容器内的服务自动启动 1、创建执行程序,以crond为例 //进入容器xxx docker exec -it xxx /bin/sh //切换root账户 bash //创建自动执行文件 vim /root/cron.sh2、自动执行文件内容 crond start3、修改执行文件权限 chmod x /root/…...

腾讯云微服务平台 TSF 异地多活单元化能力重磅升级
导语 2023腾讯全球数字生态大会已于9月7-8日完美落幕,40专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。 微服务与消息队列专场,腾讯云微服务平台 TSF 产品经理张桢带来了《腾讯云微服务平台 TSF 异地多活单元化能力重磅升级》的精彩演讲。本…...
01贪心:算法理论知识
贪心:01算法理论知识 什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 这么说有点抽象,来举一个例子: 例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额࿰…...

目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
文章目录 一、演示多分类效果二、PaddleClas介绍三、代码获取四、数据集获取五、环境搭建六、数据格式分析七、模型训练7.1 模型恢复训练7.2 多卡训练7.3 其他训练指标 八、模型预测九、模型评估十、PaddleClas相关博客 一、演示多分类效果 二、PaddleClas介绍 PaddleClas主要…...

PageHelp插件在复杂sql下引起的Having无法识别错误及其解决方案
1: 问题出现的场景 系统中有一个复杂SQL内嵌套了多个子查询.在改动时需要将SQL的最后一行加上having来做额外的过滤处理. 添加完having语句后发现SQL能够正常执行就直接将代码提交到了测试环境.结果在测试环境报错Unknown column ‘xxx‘ in ‘having clause. 2: 分析问题 1…...

linux中的开发工具
在刚开始使用linux的时候,我们需要在系统上写一些简单的代码,来熟悉环境以及各种指令 并且熟悉属于linux的一套开发的环境,而这对于c来说需要三个软件就可以进行简单的编码 和使用,让我们来认识一下下列工具,以及工具的…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...