參考部落格:
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 會產生巨集的 剖析 這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,但是它終...