container_of在linux核心中是乙個常用的巨集,用於從包含在某個結構中的指標獲得結構本身的指標,通俗地講就是通過結構體變數中某個成員的首位址進而獲得整個結構體變數的首位址。
實現方式:
container_of(ptr, type, member) ;
其實它的語法很簡單,只是一些指標的靈活應用,它分兩步:
第一步,首先定義乙個臨時的資料型別(通過typeof( ((type *)0)->member )獲得)與ptr相同的指標變數__mptr,然後用它來儲存ptr的值。
第二步,用(char *)__mptr減去member在結構體中的偏移量,得到的值就是整個結構體變數的首位址(整個巨集的返回值就是這個首位址)。
其中的語法難點就是如何得出成員相對結構體的偏移量?
通過例子說明,如清單1:
1 #include 2#define offsetof(type, member) ((size_t) &((type *)0)->member)
3#define container_of(ptr, type, member) ()
6struct
test_struct ;
11int main(void)12
;15char *ptr_ch = &init_struct.ch;
16 test_struct = container_of(ptr_ch,struct
test_struct,ch);
17 printf("
test_struct->num =%d\n
",test_struct->num);
18 printf("
test_struct->ch =%c\n
",test_struct->ch);
19 printf("
test_struct->ch =%f\n
",test_struct->f1);
20return0;
21}
或者linux核心中的函式:
struct eg2805_charger ;static void eg2805_charger_work(struct work_struct *work)
; int i=0;
int ret;
int temp, voltage;
int value = 0;
//第乙個引數為work,函式傳參下來的;第二個引數為定義的結構體,第三個則是傳參下來的裡面需要的work_struct
struct eg2805_charger *eg2805_chg = container_of(work,
struct eg2805_charger,
chg_delay_work.work);
abs int 巨集定義 巨集定義和巨集方法
巨集定義和巨集方法 定義機型 define is iphone5 uiscreen instancesrespondtoselector selector currentmode cgsizeequaltosize cgsizemake 640,1136 uiscreen mainscreen cu...
關於contain of的理解
關於contain of的理解。核心中有這樣的乙個巨集 const typeof type 0 member mptr ptr type char mptr offsetof type,member 作用是這樣的 如果你獲得了乙個大結構體裡面的乙個成員的指標,那麼通過這個巨集,你就能獲得這個結構體的...
C 巨集定義 巨集定義求面積
學過c語言的讀者,對巨集定義應該不陌生,同樣在c 中,也可以用巨集定義命令將乙個指定的識別符號來代表乙個字串,巨集定義的作用一般是用乙個短的名字代表乙個長的字串。一般形式為 define 識別符號 字串定義pi的符號常量 define pi 3.14在c 中還可以用 define命令定義帶引數的巨集...