C语言 宏定义相关
注意点
1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
在宏中小心地把参数用括号括起来。
2)懂得预处理器将为你计算常数表达式的值,不必计算出实际的值。
3) 如果,意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
2. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ?(A) : (B))
3. 得到指定地址上的一个字节或字
#define MEM_B( x ) ( *( (byte *)(x) ) )
#define MEM_W( x ) ( *( (word *)(x) ) )
4. 得到一个field在结构体(struct)中的偏移量
#define FPOS( type, field ) \
/*lint -e545 */ ( (dword) &(( type *) 0)-> field )/*lint +e545 */
5. 得到一个结构体中field所占用的字节数
#define FSIZ( type, field ) sizeof( ((type *)0)->field )
6. 按照LSB格式把两个字节转化为一个Word
#define FLIPW( ray ) ( (((word) (ray)[0]) *256) + (ray)[1] )
7. 按照LSB格式把一个Word转化为两个字节
#define FLOPW( ray, val ) \
(ray)[0] = ((val) / 256); \
(ray)[1] = ((val) & 0xFF)
8. 得到一个变量的地址(word宽度)
#define B_PTR( var ) ( (byte *)(void *) &(var) )
#define W_PTR( var ) ( (word *)(void *) &(var) )
9. 得到一个字的高位和低位字节
#define WORD_LO(***) ((byte)((word)(***) & 255))
#define WORD_HI(***) ((byte)((word)(***) >> 8))
10. 返回一个比X大的最接近的8的倍数
#define RND8( x) ((((x) + 7) / 8 ) * 8 )
11. 将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= 'a'&& (c) <= 'z') ? ((c) - 0x20) : (c) )
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. 返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
((dword)(val) & (dword)((mod_by)-1) )