使用宏定義可以防止出錯(cuò),提高可移植性,可讀性,方便性等。 下面列舉了一些成熟軟件中常用的宏定義。
重新定義一些類型,防止由于各種平臺(tái)和編譯器的不同,而產(chǎn)生的類型字節(jié)數(shù)差異,方便移植: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 */
求最大值和最小值:#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) ) #define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
得到一個(gè)field在結(jié)構(gòu)體(struct)中的偏移量:#define FPOS( type, field ) \ /*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */
得到一個(gè)結(jié)構(gòu)體中field所占用的字節(jié)數(shù):#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
按照LSB格式把兩個(gè)字節(jié)轉(zhuǎn)化為一個(gè)Word:1#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )
按照LSB格式把一個(gè)Word轉(zhuǎn)化為兩個(gè)字節(jié):#define FLOPW( ray, val ) \ (ray)[0] = ((val) / 256); \ (ray)[1] = ((val) & 0xFF)
得到一個(gè)變量的地址(word寬度):#define B_PTR( var ) ( (byte *) (void *) &(var) ) #define W_PTR( var ) ( (word *) (void *) &(var) )
得到一個(gè)字的高位和低位字節(jié):#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255)) #define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))
將一個(gè)字母轉(zhuǎn)換為大寫:#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
判斷字符是不是10進(jìn)制的數(shù)字:#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
判斷字符是不是16進(jìn)制的數(shù)字:#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\ ((c) >= 'A' && (c) <= 'F') ||\ ((c) >= 'a' && (c) <= 'f') )
防止一個(gè)頭文件被重復(fù)包含:#ifndef COMDEF_H #define COMDEF_H //頭文件內(nèi)容 #endif
防止溢出的一個(gè)方法:#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
返回?cái)?shù)組元素的個(gè)數(shù):
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
|