当前位置: 首页 > news >正文

【C/C++】#define宏替换高级用法

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、传参数的宏替换
  • 二、宏替换不会做表达的运算
  • 三、宏替换多行—反斜杠连接
  • 四、#undef取消宏替换
  • 五、宏替换转字符串、拼接等用法
  • 六、宏替换的优缺点

在C语言中曾介绍过宏定义的基本使用方法:

【c语言】详解宏定义#define 各种使用方法

本文将深入介绍宏替换的更高级用法

==================================================

宏替换一般这样使用:

#define N 100

在预处理期能将N替换为100,然后进行编译

一、传参数的宏替换

宏替换可以传递参数

#define M(VALUE) int a = VALUE;

在使用宏时,可以将实参传递给宏定义中定义的形参,主函数使用方法如下:

	M(3);cout << a << endl;

在这里插入图片描述

二、宏替换不会做表达的运算

定义一个乘法宏替换:

#define MUL(A,B) A*B

在这里插入图片描述

如果加上运算符,宏替换就不会做想象中的运算:

在这里插入图片描述

此时运算过程为 1 + 3 * 2 == 7,而不是1先+3再*2

函数参数只是替换的作用,不会像函数参数一样做表达式的运算

可以在宏定义中添加括号解决:

#define MUL(A,B) ((A)*(B))

在这里插入图片描述

宏替换中的运算符也不会运算:

只是单纯的替换,不会先1+2再*2,而是1 + 2 * 2 == 5

在这里插入图片描述

三、宏替换多行—反斜杠连接

一般来说,宏替换只会替换当前行,如果想要替换多行代码,可以使用反斜杠/实现:

在每行末尾添加反斜杠/(一般最后一行不用),反斜杠/的含义是用来连接当前行和下一行

#define TianXi(N)	\for (int i = 0; i < N; i++)\{\cout << i << "   ";\}cout << endl;

在这里插入图片描述

注意事项:反斜杠/的后面不能写任何东西(包括空格、注释等)

四、#undef取消宏替换

使用#undef可以限制宏替换的作用范围,在#undef的下面取消对某个宏的定义

在这里插入图片描述

五、宏替换转字符串、拼接等用法

使用#可以将宏替换中的参数转换为字符串

#define Q(A) #A		
Q(TianXi);	// "TianXi"

在这里插入图片描述
使用#@可以将宏替换中的参数转换为单个字符

#define W(A) #@A
W(!);	// '!'

在这里插入图片描述

使用##可以将宏替换和其他语句拼接

#define S(A) int a##A=1;
S(3);	//int a3 = 1;

在这里插入图片描述

六、宏替换的优缺点

宏替换的优点:

  • 便于维护,提高代码的可读性
  • 由于宏替换将代码片段在预处理期替换,可以提高程序的执行效率

宏替换的缺点:

  • 没有安全类型的检查
  • 宏定义在部分代码中可能不直观,可能不方便调试
  • 宏替换不会运算求解

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
http://www.lryc.cn/news/146685.html

相关文章:

  • Android 之 传感器专题 (4) —— 其他传感器了解
  • 【高级搜索】双向广搜,A*,IDDFS,IDA *算法总结 (terse版)
  • CATIA Composer R2023安装教程
  • git,修改远程分支名称
  • 信息系统项目管理师(第四版)教材精读思维导图-第六章项目管理理论
  • [Android]JNI的基础知识
  • 力扣-哈希-字母异位词分组
  • excel 分组排序
  • vue三级市区联动
  • C++ 组合类
  • HTML总结2 [转]
  • 【LeetCode-中等题】2. 两数相加
  • postman接口参数化设置
  • easyexcel poi根据模板导出Excel
  • 怎么把pdf图片转换成jpg?pdf转jpg的方法分享
  • MongoDB 双机热备那篇文章是 “毒”
  • Leetcode17电话号码的组合
  • 入职一家公司只会功能测试,如何进一步提升自己?
  • WordPress导航主题源码
  • 基于ADAU1452 DSP ANC和AEC算法的实现
  • Wireshark数据抓包分析之传输层协议(TCP协议)
  • ADRV9009子卡 设计原理图:FMCJ450-基于ADRV9009的双收双发射频FMC子卡 便携测试设备
  • Linux 桌面上的 Firefox 面临着大问题
  • 查漏补缺 - 构造函数,原型,this,原型链,继承
  • C# 学习笔记--个人学习使用 <2>
  • Linux网络编程Socket通信6-Libevent移植与使用
  • c#:委托 泛型委托的使用 泛型约束
  • 大数据之linux入门
  • MPI之MPI_Sendrecv接口以及空进程概念介绍
  • Revit SDK:PointCurveCreation 创建点来拟合曲线