1.带参数的宏
像函数的宏
#define cube(x) ((x)(x)(x))
宏可以带参数
#define cube(x) ((x)*(x)*(x))
int main()
{
printf("%d\n",cube(5));//125
return 0;
}
#define cube(x) ((x)*(x)*(x))
int main()
{
int i;
scanf("%d",&i);
printf("%d\n",cube(i));
return 0;
}
2.错误定义的宏
#define RADTODEG1(x) (x*57.29578)
#define RADTODEG2(x) (x)*57.29578
#define RADTODEG1(x) (x*57.29578)
#define RADTODEG2(x) (x)*57.29578
int main()
{
printf("%f\n",RADTODEG1(5+2));//119.591560 因为这样写变成了(5+2*57.29578
printf("%f\n",180/RADTODEG2(1));//10313.240400 变成了180/(1)*57.29578
return 0;
}
3.带参数的宏的原则
一切都要括号
整个值要括号
参数出现的每个地方都要括号
#define RADTODEG2(x) ((x)*57.29578))
4.可以带多个参数
#define MIN(a,b) ((a)>(b)?(b):(a))
也可以组合(嵌套)使用其他宏
5.分号?
宏定义结束后,千万不要加分号
6.带参数的宏在大型程序的代码中使用非常普遍
可以非常复杂,如“产生”函数
在#和##这两个运算符的帮助下
存在中西方文化差异
部分宏会被inline函数替代
7.其他编译预处理指令
条件编译
error
……