define宏定义详解
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 B
A就是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
最后,希望大家能自己多发现更多的用法,如果有什么错误或不准确的地方请大家批评指出,我一定会第一时间更正!