常用宏定义

来源:互联网 发布:c语言书籍推荐 知乎 编辑:程序博客网 时间:2024/06/04 19:02
1
防止一个头文件被重复包含 
#ifndef COMDEF_H 
#define COMDEF_H 
  //头文件内容 
#endif 
文件开头处#define DEBUG,在代码中加调试代码#ifdef DEBUG{}#endif

2
重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 
typedef  unsigned char      boolean;     /* Boolean value type. */ 
typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */ 
typedef  unsigned short     uint16;      /* Unsigned 16 bit value */ 
typedef  unsigned char      uint8;       /* Unsigned 8  bit value */ 
typedef  signed long int    int32;       /* Signed 32 bit value */ 
typedef  signed short       int16;       /* Signed 16 bit value */ 
typedef  signed char        int8;        /* Signed 8  bit value */ 

3
得到指定地址上的一个字节或字 
#define  MEM_B( x )  ( *( (byte *) (x) ) ) 
#define  MEM_W( x )  ( *( (word *) (x) ) ) 
得到一个变量的地址(word宽度) 
#define  B_PTR( var )  ( (byte *) (void *) &(var) ) 
#define  W_PTR( var )  ( (word *) (void *) &(var) ) 

4
求最大值和最小值 
#define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) ) 
#define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) 

5
按照LSB格式把两个字节转化为一个Word 
#define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] ) 

按照LSB格式把一个Word转化为两个字节 
#define  FLOPW( ray, val ) \ 
  (ray)[0] = ((val) / 256); \ 
  (ray)[1] = ((val) & 0xFF) 

得到一个字的高位和低位字节 
#define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255)) 
#define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8)) 

6
得到一个field在结构体(struct)中的偏移量 
#define FPOS( type, field ) \ 
/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */ 

得到一个结构体中field所占用的字节数 
#define FSIZ( type, field ) sizeof( ((type *) 0)->field ) 

7
将一个字母转换为大写 
#define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) ) 

8
返回数组元素的个数 
#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) ) 

9
对于IO空间映射在存储空间的结构,输入输出处理 
  #define inp(port)         (*((volatile byte *) (port))) 
  #define outp(port, val)   (*((volatile byte *) (port)) = ((byte) (val)))