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 ))
該巨集是用e來使函式在編譯的時候判斷能否繼續編譯進行,當e為0是,編譯通過,當e為非0時非法語句,編譯不通過。
4.#define container_of(ptr, type, member) ()
該巨集通過已知tpye型別的結構體中的乙個成員的指標,找到這個結構體的指標。該巨集返回type型別結構體指標
sizeof是如何實現的,和核心裡面巨集如出一轍
0x00 很多東西用多了就缺乏了,洞察力,覺得就該如此。這也許就是中國那句老話 當局者迷。今天看到c群裡面的乙個學生問求乙個陣列的大小如何寫,當然不由自主的敲了sizeof 0x04 sizeof是乙個運算子不是函式,但是我突然覺得,他是如何實現的那?如果是乙個字串還可以判斷末尾的 0 那對一塊記憶...
linux核心裡的GPIO操作函式
1.gpio set value unsigned gpio,int value 用來設定gpio暫存器的值 2.gpio direction output unsigned gpio,int value 用來設定gpio為輸出功能,同時設定gpio輸出的值。一般來說,設定乙個gpio口為輸出,先執...
C語言巨集的特殊用法和幾個坑
2 years ago source 總結一下c語言中巨集的一些特殊用法和幾個容易踩的坑。由於本文主要參考gcc文件,某些細節 如巨集引數中的空格是否處理之類 在別的編譯器可能有細微差別,請參考相應文件。巨集僅僅是在c預處理階段的一種文字替換工具,編譯完之後對二進位制 不可見。基本用法如下 1.標示...