# include<cstdio> # include<iostream> using namespace std; # define OK 123 # define PI 3.1415926 # define S PI*y*y //完成了宏的嵌套,也就是说在展开S这个宏的时候,PI已经被代换了 int main(void) { int y;cin>>y; cout<<S<<endl; cout<<"OK"<<endl;//加了引号后,预处理程序将不对OK进行宏代换 cout<<OK<<endl; return 0; }
***********************************************************
带参数的宏
/* 需要注意带参数的宏和函数的区别 1.带参数的宏的形参变量不会分配内存单元,因此不必做类型说明, 这是与函数的情况不同的,因为函数中的情况往往需要对形参做类型 说明,并且形参将占据一定的内存空间. 2.在带参的宏当中,只存在符号的代换,不存在值传递的问题. */ # include<cstdio> # include<iostream> using namespace std; # define MAX(a,b) (a>b)?a:b //用宏名MAX表示条件表达式(a>b)?a:b int main(void) { int x,y,max; cin>>x>>y; max = MAX(x,y); //max = MAX(x,y); 将变成 max = (a>b)?a:b; cout<<max<<endl; return 0; }
带参数的宏的几种特例
# include<cstdio> # include<iostream> using namespace std; # define SQ(y) (y)*(y) # define SQ(y) y*y // 相当于 a+1*a+1 != (a+1)*(a+1) int main(void) { int a; int sq; cin>>a; sq = SQ(a+1);//注意这条语句的执行过程, //首先用a+1去替换y,然后用(a+1)*(a+1)去替换SQ(a+1) cout<<sq<<endl; return 0; } # define SQ(y) ((y)*(y)) //想想,如果这里使用 # define SQ(y) (y)*(y)为什么得不到预期的结果 int main(void) { int a,sq; cin>>a; sq = 16/SQ(a+1); cout<<sq<<endl; return 0; }