本文章思路来源于:
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;
}