C语言的宏定义

宏定义

默认全部用大写字母,以示与普通变量的区分

开始

从你定义开始

#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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值