linux核心裡面幾個特殊的巨集定義

2021-06-25 10:28:14 字數 920 閱讀 7499

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.標示...