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

本文详细介绍了C语言中的宏替换,包括传参数、运算限制、多行连接、取消定义、字符串拼接等内容,以及其优缺点分析。

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

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

在这里插入图片描述

c语言内容💖:

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

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


在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;

在这里插入图片描述

六、宏替换的优缺点

宏替换的优点:

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

宏替换的缺点:

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

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
//#include<iostream> //using namespace std; ////别名替换 ////#define A B // //#define 整数 int //整数 a{ 100 };//可以是中文和字母,但是不能是数字、符号等。示例:12325。#$%(); // //#define _hhh_ int b=250;//define 在替换上会有点无脑,这里以后只要是输入 _hhh_ 都会替换成 int b; // //#define VERSION "2.0.1"//好处是我在“用的地方多了,在这改内容,可以直接作用到输出这个变量名内” //#define SCREEN_WIDTH 1980//声明常量,这个表达情况在C语言中用得比较多 //const int screen_width{ 1980 };//这个是在C++用得比较多,也是常量声明 // ////#define int float ////#define true false//用得太广泛,连true都可以变改,这里的话,容易不安全,在define的常量申明和替换,容易不安全 // //#define X //相当于X不存在了,去作为一种替换 //#define UNICON //定义UNICON的用法 // //#define _in_ //#define _out_ //这两个的意义都是关于标识, int ave(_in_ int a,_out_ int& b),告诉别人这个是输入,输出,没有太大意义 ////#define functionptr //定义一个指针int ave(_in_ int a,functionptr int& b)这里也是修饰符号的作用 // ///*int ave( _in_; int f, _out_ int& g) //{ //return a+b //};*/ // // //#define TEXT //int main() { // // // cout <<a<< " "<<endl; // // _hhh_{ 250; }//发现个问题 // cout << b<< " " << endl; // // cout << VERSION<<" "<<endl; // cout << SCREEN_WIDTH << " " << endl; // cout << screen_width; // // int X a{ 2500 };//当中的X相当于不存在 等同于 int a{2500} // // int TEXT A{ 250 }; // #undef TEXT // //int TEXT A{ 250 };//第三种用法就是undef会关停这个TEXT,但是不影响其他的 //} //定义复杂表达的宏 #include<iostream> using namespace std; #define SUM(X,Y) X+Y*3; #define RELEASE(x) delete[]x,x=nullptr; #define BIGGER(X,Y)((X)>(Y)?(X):(Y)) #define SHOW1(X)std::cout<<#X//用这个输出直接就是字符串 #define SHOW(X,Y) void X##Y(){std::cout<<#X;}//声明函数使用 //发现这里的define的应用,表达时不是表达式 SHOW(text,22)//这里是直接声明了个函数 int main() { cout << SUM(100, 200)" ";//这个不是函数,是直接表示计算 //cout << SUM(100, 200) << " " << endl;//这里这种表达需要表达式,怎么回事 int* a = new int[50]; RELEASE(a)" ";//可以很好的全局应用 //delete[]a; //a = nullptr; std::cout << BIGGER(100, 200)<<" "; SHOW1(1234687454565)" "; text22(); } 当中的两组代码,的注释理解都对吗,请帮助分析总结,因为我是个新手学员,搞不懂,请麻烦解释分析,帮助我理解底层逻辑,让我对deffine的理解通俗易懂,帮助我彻底理解整个他的内容
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值