巨集定義的使用技巧

2021-09-25 11:04:58 字數 1744 閱讀 5580

參考部落格:

1、防止乙個標頭檔案被重複包含

#ifndef bodydef_h

#define bodydef_h

//標頭檔案的內容

#endif

2、重定義一些型別,防止由於各種平台和編譯器的不同,而產生的型別位元組數的差異,方便移植。

typedef unsigned char boolean;

3、得到指定位址的乙個位元組或字

#define mem_b(x) (*(uint8 *)(x))

#define mem_w(x) (*(uint16 *)(x))

4、得到乙個field在結構體(struct)中的偏移量

#define fpos(type,field)  ((uint32)&((type*)0)->field)
5、得到乙個結構體中field所占用的位元組數

#define fsiz(type,field) sizeof(((type*)0)->field)
6、求最大值和最小值

#define max(x,y) (((x)>(y))?(x):(y))

#define max(x,y) (((x)<(y))?(x):(y))

7、得到乙個變數的位址

#define b_ptr(var) ((byte*)(void *)&(var))

#define w_ptr(var) ((word*)(void*)&var)

8、按照lsb格式把兩個位元組轉化為乙個word

#define flipw(ray)  ((((word)(ray)[0])*256)+(ray)[1])
9、按照lsb格式把乙個word轉化為兩個位元組

#define flopw(rey,val)  \

(ray)[0]=((val)/256); \

(ray)[1]=((val)&0xff)

10、得到乙個字的高位和地位位元組

#define word_lo(***)  ((byte)((word)(***)&0xff))

#definr word_hi(***) ((byte)((word)(***)>>8))

11、將乙個字母轉換為大寫

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、返回乙個比x大的最接近的8的倍數

#define rnd8(x)  ((((x)+7)/8)*8)

巨集定義使用技巧

巨集定義使用技巧 1 把列舉值轉換為字串 define caseenum e case e printf e 2 利用二進位制表示式得到編譯期常量 define cat a,b a b cat 1,2 12 3 給標準斷言新增描述性注釋 define assertmsg a,b assert a b...

巨集定義使用技巧

題這幾天面試題會遇到一些關於define 的用法,在這裡做下總結,紅色部分筆試常見題型。1.防止乙個標頭檔案被重複包含 ifndef comdef h define comdef h 標頭檔案內容 endif 2.得到乙個字的高位和地位位元組 define word lo byte word 255...

巨集定義相關技巧

寫乙個 標準 巨集min,這個巨集輸入兩個引數並返回較小的乙個。另外,當你寫下面的 時會發生什麼事 least min p b 解答 define min a,b a b a b min p b 會產生巨集的 剖析 這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,但是它終...