3 宏的常见用法防止一个头文件被重复包含

#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif

得到指定地址上的一个字节或字

#define MEM_B(x) (*((byte *)(x)))#define MEM_W(x) (*((word *)(x)))

求最大值和最小值

#define MAX(x,y) (((x)》(y)) ? (x) : (y))#define MIN(x,y) (((x) 《 (y)) ? (x) : (y))

得到一个field在结构体(struct)中的偏移量

#define FPOS(type,field) ((dword)&((type *)0)-》field)

得到一个结构体中field所占用的字节数

#define FSIZ(type,field) sizeof(((type *)0)-》field)

按照LSB格式把两个字节转化为一个Word

#define FLIPW(ray) ((((word)(ray)[0]) * 256) + (ray)[1])

得到一个字的高位和低位字节

#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))#define WORD_HI(xxx) ((byte) ((word)(xxx) 》》 8))

将一个字母转换为大写

#define UPCASE(c) (((c)》=‘a’ && (c) 《= ‘z’) ? ((c) – 0×20) : (c))

判断字符是不是10进制的数字

#define DECCHK(c) ((c)》=‘0’ && (c)《=‘9’)

判断字符是不是16进制的数字

#define HEXCHK(c) (((c) 》= ‘0’ && (c)《=‘9’) ((c)》=‘A’ && (c)《= ‘F’) \((c)》=‘a’ && (c)《=‘f’))

防止溢出的一个方法

#define INC_SAT(val) (val=((val)+1》(val)) ? (val)+1 : (val))

返回数组元素的个数

#define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))