宏定义
默认全部用大写字母,以示与普通变量的区分
开始
从你定义开始
#define PI 3.14
结束
默认到程序结束时结束,可以提前结束,用
#undef PI
宏定义的嵌套
#define R 12
#define PI 3.14
#define S PI*R*R
带参数的宏定义
作用与函数类似,但是没有函数那么聪明,他是机械的替换,为了避免因运算符优先级问题造成错误,用宏定义计算的时候尽量加小括号
#define MAX(x,y) ((x>y)?(x):(y))
不加括号问题举例
#define SQUARE(x) x*x
//如果你传入的数是但个数可能会出现问题,如果传入的式子,大概率出问题
int main(void)
{
int a;
scanf("%d",&a);
printf("%d\n",SPUARE(a));
printf("%d\n",SPUARE(a+1));
return 0;
}
结果
为什么会这样?说白了宏定义就是机械替换,下面那行变成了计算x+1*x+1结果当然为11了,如果加上括号则能正确运算
#define SQUARE(x) ((x)*(x))
//如果你传入的数是但个数可能会出现问题,如果传入的式子,大概率出问题
int main(void)
{
int a;
scanf("%d",&a);
printf("%d\n",SPUARE(a));
printf("%d\n",SPUARE(a+1));
return 0;
}
结果
#和##
1、#会把参数变为字符串
#define STR(x) # s
...
printf("%s\n",STR(abc));//正常情况下字符串要加""引起来,这里没有一样可以
如果有相同的字符只会打印一个,例如你后面加很多空格,他只会打印一个空格
2、##是数字链接运算符
#define ADD(x,y) x##y
int main(void)
{
printf("%d\n",ADD(5,20));//会打印520,好想只能链接数字,字符不行
}
宏定义的可变参数
一些花里胡哨的打印方法,据说STM32里能用到哈哈
#define PRINT(...) printf(# __VA_ARGS__)
...
PRINT(abc, 520, but,\n);
#define PRINT(format,...) printf(# format,##__VA_ARGS__)
...
PRINT(num = %d,520);