C语言 宏定义相关

来源:互联网 发布:数据库怎么输入查询 编辑:程序博客网 时间:2024/06/05 10:35

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) )

 

0 0
原创粉丝点击