linux核心裡面幾個特殊的巨集定義
1.BITS_TO_LONGS(nr)
#define BITS_PER_BYTE8
define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
#define BITS_TO_LONGS(nr)DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))為DIV_ROUND_UP(nr, 32)
所以BITS_TO_LONGS(nr)為(nr + 31)/32,就是求nr數字是32的多少倍。
2.ALIGN(x,a)
#define ALIGN(x,a)__ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask)(((x)+(mask))&~(mask))
typeof(x)(a)表示用X的型別來重定義a,
然後算出X,以mask為掩碼的上界數。
計算a以size為倍數的上下界數:
#define alignment_down(a, size) (a & (~(size-1)) )
#define alignment_up(a, size) ((a+size-1) & (~ (size-1)))
注意size為2的n次方
3.#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
該巨集是用e來使函式在編譯的時候判斷能否繼續編譯進行,當e為0是,編譯通過,當e為非0時非法語句,編譯不通過。
4.#define container_of(ptr, type, member) ({
\
const typeof(((type *)0)->member) * __mptr = (ptr);\
(type *)((char *)__mptr - offsetof(type, member)); })
該巨集通過已知tpye型別的結構體中的一個成員的指標,找到這個結構體的指標。該巨集返回type型別結構體指標