欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

define宏定义详解

程序员文章站 2024-03-23 13:42:04
...

define宏定义的详解

c/c++中,有这样的一个预处理,就是define 可以用 #define 定义一个标识符来表示一个常量。特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。define被称作是宏定义使用起来十分的方便简单,比如下面的例子
#define N 1000000
这是一个简单的宏定义,就是N值为1000000可以直接用到数组里举个比较简单的例子吧

#include<bits/stdc++.h>
#define N 1000000
using namespace std;
int a[N],b[N],c[N];

这样就相当于定义了a,b,c三个大小都为1000000的数组,当你发现测试数据越界时也可以直接改#define N 1000000进行补救,这样不必手打1000000,而且更改方便
如果你下面要更新一下这个字母代表的数字你需要#undef 命令

#undef  N

就可以把N停下了
————————————————————————————
很多同学喜欢在繁忙的OI之余自己写亿些小游戏,Sleep();这个函数可以增加bi格,但是如此之多的的Sleep();打起来属实令人不爽,于是你可以这样搞

#define S Sleep(900)

然后你就可以用S来代替 Sleep(900)了简单实用,比如下面这个例子

#include<bits/stdc++.h>//习惯打万能头了
#include<windows.h>//因为要用到Sleep()函数,所以加载windows库
#define S9 Sleep(900)
#define S5 Sleep(500)
using namespace std;
int main(){
	cout<<"hello";
	S9;
	cout<<"world";
	S5;
	cout<<"!";
}

当然用代替一段代码时可以写出来这样的诡异代码

#include<bits/stdc++.h>//习惯打万能头了
#include<windows.h>//因为要用到Sleep()函数,所以加载windows库
#define S9 Sleep(900);//加了分号 
#define S5 Sleep(500);//加了分号 
using namespace std;
int main(){
	cout<<"hello";
	S9//去了分号 
	cout<<"world";
	S5//去了分号 
	cout<<"!";
}

是不是诡异至极?没加分号也能编译?!!,实际上是不正确的,在编译器里这个S9和S5已经变成了后面的Sleep(900),Sleep(500)了这样就相当于S9,S5已经至极替换为上面的了,自然不用加分号,如果加上也没什么大问题,这里只不过更好理解其特性罢了
这里想必大家已经看出了大概,就是#define A BA就是B的另一个称呼罢了A为IT B为int 时就做到了能用IT a代表int a
这里你可能会说,也不过如此嘛,但实际上define还有更高级的应用,就是他带参数

#define MAX(x,y) ((x)>(y)?(x):(y))
i=MAX(j+k,m-n);

这就是含有x,y双参数的一个宏定义而且这些参数甚至可以是表达式

什么?跟函数差不多?

带参数的宏和带参函数很相似,但有本质上的不同,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。
下面举一个例子进行对比:

#include <bits/stdc++.h>
using namespace std;
int SQ(int y){
	return((y)*(y));
}
int main(){
	int i=1;
	while(i<=5)
	printf("%d\n",SQ(i++));
	return 0;
}

#include <bits/stdc++.h>
#define SQ(y) ((y)*(y))
using namespace std;
int main(){
	int i=1;
	while(i<=5)
	printf("%d\n",SQ(i++));
	return 0;
}

跑一下,是不是答案不一样?
在使用函数的例子中,函数调用是把实参i值传给形参y后自增1。然后输出函数值。因而要循环5次。输出1~5的平方值
而在使用宏的例子中,宏调用时,只作代换。SQ(i++)被代换为((i++)*(i++))。这就造成的两种结果的天差地别,所以要根据题目或应用合理选择,充分发挥其价值

在用#define 定义时 , 斜杠" \ “是用来续行的,”#“用来把参数转换成字符串,是给参数加上双引号。”##“则用来连接前后两个参数,把它们变成一个字符串,”#@"是给参数加上单引号。
比如:

#define Conn(x,y) x##y
#define ToChar(a) #@a
#define ToString(x) #x
int n = Conn(123,456); 结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
char a = ToChar(1);结果就是a='1';
char* str = ToString(123132);就成了str="123132";

define还可以嵌套

#define N 456
#define S N*9998+y

最后,希望大家能自己多发现更多的用法,如果有什么错误或不准确的地方请大家批评指出,我一定会第一时间更正!

相关标签: c++