C语言——宏列表实现

本文章思路来源于:
https://www.cnblogs.com/bhlsheji/p/4614441.html

宏列表作用:更加方便和整齐地定义和读取标志位

思路解析:

1、它定义了一个FLAG_LIST( _ )宏,宏里参数为“ _ ”,后续如_(UVC)、_(PTC)替换,比如调用FLAG_LIST宏,传入参数是a,那么替换后面 _(UVC)中的“ _ ”,得到a(UVC)

#define FLAG_LIST(_)\
  _(UVC)\
  _(PTC)

2、假如后面我们定义一个枚举如下:

 enum Flag{
    None = 0,
    FLAG_LIST(DEFINE_FLAG)
    Total
 };

对FLAG_LIST(DEFINE_FLAG)扩展,DEFINE_FLAG替换“FLAG_LIST( _ )”宏中的 “_” ,就可以得到:

 enum Flag{
    None = 0,
    DEFINE_FLAG(UVC)
    DEFINE_FLAG(PTC)
    Total
 };

3、定义另一个宏,注意flag后的逗号,结合第2点的枚举,DEFINE_FLAG(UVC)宏中的UVC替换flag,得到“UVC,”

#define DEFINE_FLAG(flag) flag,

可拓展得到枚举,方便后面访问函数获取对应标志位的数值:

 enum Flag{
    None = 0,
    UVC,  /* 逗号这里用到 */
    PTC,
    Total
 };

4、接着定义一些访问函数就可以了

#define FLAG_ACCESSOR(flag)\
unsigned short Is##flag(void){\
	return (StatusFlag&((0x0001u)<<flag));\
}\
void set##flag(void){\
	StatusFlag |= ((0x0001u)<<flag);\
}\
void clear##flag(void){\
	StatusFlag &= ((~(0x0001u))<<flag);\
}\

实现代码:

#include <stdio.h>

static unsigned short StatusFlag = 0;

#define FLAG_LIST(_)\
  _(UVC)\
  _(PTC)

#define DEFINE_FLAG(flag) flag,
 enum Flag{
    None = 0,
    FLAG_LIST(DEFINE_FLAG)
    Total
 };

#define FLAG_ACCESSOR(flag)\
unsigned short Is##flag(void){\
	return (StatusFlag&((0x0001u)<<flag));\
}\
void set##flag(void){\
	StatusFlag |= ((0x0001u)<<flag);\
}\
void clear##flag(void){\
	StatusFlag &= ((~(0x0001u))<<flag);\
}\

FLAG_LIST(FLAG_ACCESSOR)
#undef FLAG_ACCESSOR

int main(void)
{
	printf("\r\nStatusFlag = %#x", StatusFlag);
	setUVC();
    printf("\r\nsetUVC()后,StatusFlag = %#x", StatusFlag);
    setPTC();
    printf("\r\nsetPTC()后,StatusFlag = %#x", StatusFlag);

    printf("\r\nIsUVC() = %#x", IsUVC());
    printf("\r\nIsPTC() = %#x", IsPTC());

    clearUVC();
    printf("\r\nclearUVC()后,StatusFlag = %#x", StatusFlag);
    clearPTC();
    printf("\r\nclearPTC()后,StatusFlag = %#x", StatusFlag);
	return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值