核心 巨集定義 container of

2021-10-07 11:45:42 字數 1571 閱讀 5034

container_of

1.1 container_of介紹

定義:container_of在linux核心的include/linux/kernel.h中定義。

#define container_of(ptr, type, member) ()

說明:根據"結構體(type)變數"中的"域成員變數(member)的指標(ptr)"來獲取指向整個結構體變數的指標。

(01) typeof( ( (type *)0)->member ) 取出member成員的變數型別。

(02) const typeof( ((type *)0)->member ) *__mptr = (ptr) 定義變數__mptr指標,並將ptr賦值給__mptr。經過這一步,__mptr為member資料型別的常量指標,其指向ptr所指向的位址。

(04) (char *)__mptr 將__mptr轉換為位元組型指標。

(05) offsetof(type,member)) 就是獲取"member成員"在"結構體type"中的位置偏移。

(06) (char *)__mptr - offsetof(type,member)) 就是用來獲取"結構體type"的指標的起始位址(為char *型指標)。

(07) (type *)( (char *)__mptr - offsetof(type,member) ) 就是將"char *型別的結構體type的指標"轉換為"type *型別的結構體type的指標"。

1.2 container_of示例**(containerof_test.c)

#include #include // 獲得結構體(type)的變數成員(member)在此結構體中的偏移量。

#define offsetof(type, member) ((size_t) &((type *)0)->member)

// 根據"結構體(type)變數"中的"域成員變數(member)的指標(ptr)"來獲取指向整個結構體變數的指標

#define container_of(ptr, type, member) ()

struct student

;void main()

結果

type是結構體,它代表"整體";而member是成員,它是整體中的某一部分,而且member的位址是已知的。

將offsetof看作乙個數學問題來看待,問題就相當簡單了:已知'整體'和該整體中'某乙個部分',要根據該部分的位址,計算出整體的位址。

巨人的肩膀:

核心巨集定義

參考 例如 include include define string hello world i love u n int main 執行結果 helloworld i love u 分割線因為對於乙個大程式而言,我們可能要定義很多常量 不管是放在原始檔還是標頭檔案 那麼我們有時考慮定義某個常量時...

linux 核心 THIS MODULE巨集定義詳解

結構體struct module在核心中代表乙個核心模組,通過insmod 實際執行init module系統呼叫 把自己編寫的核心模組插入核心時,模組便與乙個 struct module結構體相關聯,並成為核心的一部分。下面是結構體struct module的完整定義,接下來會逐個解釋 struc...

abs int 巨集定義 巨集定義和巨集方法

巨集定義和巨集方法 定義機型 define is iphone5 uiscreen instancesrespondtoselector selector currentmode cgsizeequaltosize cgsizemake 640,1136 uiscreen mainscreen cu...