参考博客:https://blog.youkuaiyun.com/zhu2695/article/details/9155593
1、防止一个头文件被重复包含
#ifndef BODYDEF_H
#define BODYDEF_H
//头文件的内容
#endif
2、重定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数的差异,方便移植。
typedef unsigned char boolean;
3、得到指定地址的一个字节或字
#define MEM_B(x) (*(uint8 *)(x))
#define MEM_W(x) (*(uint16 *)(x))
4、得到一个field在结构体(struct)中的偏移量
#define FPOS(type,field) ((uint32)&((type*)0)->field)
5、得到一个结构体中field所占用的字节数
#define FSIZ(type,field) sizeof(((type*)0)->field)
6、求最大值和最小值
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MAX(x,y) (((x)<(y))?(x):(y))
7、得到一个变量的地址
#define B_PTR(var) ((byte*)(void *)&(var))
#define W_PTR(var) ((word*)(void*)&var)
8、按照LSB格式把两个字节转化为一个word
#define FLIPW(ray) ((((word)(ray)[0])*256)+(ray)[1])
9、按照LSB格式把一个word转化为两个字节
#define FLOPW(rey,val) \
(ray)[0]=((val)/256); \
(ray)[1]=((val)&0xFF)
10、得到一个字的高位和地位字节
#define WORD_LO(***) ((byte)((word)(***)&0xFF))
#definr WORD_HI(***) ((byte)((word)(***)>>8))
11、将一个字母转换为大写
#define UPCASE© ((©>=‘a’&&©<=‘z’)?(©-0x20):©)
12、判断字符是不是10进制的数字
#define DECCHK(c) ((c)>='0'&&(c)<='9')
13、判断字符是不是16进制的数字
#define HEXCHK(c) (((c)>='0'&&(c)<='9')|| \
((c)>='A'&&(c)<='F')||\
((c)>='a'&&(c)<='f'))
14、防止溢出的一个方法
#define INC_SAT(val) ((val)=(val)+1>(val)?(val)+1:(val))
15、返回数组元素的个数
#define ARR_SIZE(a) (sizeof((a))/sizeof((a)[0]))
16、返回一个比x大的最接近的8的倍数
#define RND8(x) ((((x)+7)/8)*8)