C语言带参#define个人理解

        之前接触带参#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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值