之前接触带参#define比较少,这几天、查阅stm32官方固件库,看到以下代码有点懵:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB) || \
((PERIPH) == GPIOC) || \
((PERIPH) == GPIOD) || \
((PERIPH) == GPIOE) || \
((PERIPH) == GPIOF) || \
((PERIPH) == GPIOG))
后来上网查了下资料,对带参#define有了一些总结:
1.#define的逻辑判断
2.#define的“单纯”
一. #define的逻辑判断
对于带参数#define,个人的理解是它具有一定的逻辑判断功能,例如下图代码:
#define _CRT_SECURE_NO_WARNINGS
#define a(b) (b==1)||(b==2)
#include<stdio.h>
void tell(int *);
int main()
{
//输入b的值然后在tell中进行判断
int b = 0;
scanf("%d",&b);
tell(a(b));
return 0;
}
void tell(int *b)
{
while (1)
{
if (a(*b))
{
printf("b=1\n\n");
scanf("%d", b);
}
else
{
printf("b≠1\n");
return;
}
}
}
在tell()函数中,对a(b)的值进行判断。如果a(b)返回true,则显示 b = 1,如果a(b)返回false,则显示 b ≠ 1。换言之,a(b)是有返回值的。查看宏定义可以发现,有以下宏定义:#define a(b) (b==1)||(b==2),意思就是用a(b)来代替 (b == 1)||(b == 2)这条表达式,如果b = 1或者b = 2,那么a(b)返回true,否则返回false。
某种程度来说,个人觉得此a(b)宏定义与以下函数定义有异曲同工之妙:
bool a(int b)
{
if ((b == 1) || (b == 2))
{
return true;
}
else
{
return false;
}
}
运行结果如下:
二.#define的"单纯"
#define可以起到一个很单纯地文本替代作用:
#include<stdio.h>
#define a(x) x*x*x
#define b(x) 100/x
int main()
{
int c = 1;
int d = 1;
printf("a(c+1)的值为:%d\n\n",a(c+1));
printf("b(d+1)的值为:%d\n\n",b(d+1));
return 0;
}
运行结果:
图中代码首先对a(x)和b(x)宏定义 ,随后输出 a(c+1) 与 b(d+1) 的值。
直观感受 a(c+1) 应该等于 2*2*2 = 8, b(d+1)的值应该等于 100/2 = 50,但事与愿违,究其原因就是#define 只是从字面上把x替换为 a(x) 或 b(x),导致真实的计算过程是:a(c+1) = 1+1*1+1*1+1 = 1 + 1 +1 +1 = 4 。b(d+1) = 100/1 + 1 = 101。因此,如果要得到8和50的结果, 需要这样宏定义:
#define a(x) (x)*(x)*(x)
#define b(x) 100/(x)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)