#include #define offset_of(type,member) ((int)&(((type *)0)->member))view code#define container_of(ptr,type,member) ()
struct
mytest;
intmain()
(一).分析下巨集定義1:
#define offset_of(type,member) ((int)&(((type *)0)->member))(二).分析下巨集定義2:
#define container_of(ptr,type,member) ()2.1. 分析 const typeof(((type *)0)->member) *__mptr = ptr;
const typeof(((type *)0)->member) :typeof是關鍵字,獲取成員型別。此部分是得到巨集傳過來的成員型別。
const typeof(((type *)0)->member) *__mptr = ptr :此部分為什麼要重新定義__mptr呢?這就是寫linux核心工程師的牛逼,嚴謹之處。如果開發者使 用時輸入的引數有問題:ptr與member型別不匹配,編譯時便會有warnning, 但是如果去掉改行,那個就沒有了,而這個警告恰恰是必須的(防止出錯有不 知道錯誤在**)。。。
2.2. 分析(type *)((char *)__mptr - offset_of(type,member));
(type *)((char *)__mptr - offset_of(type,member)):將char * 強制轉化為(type *)
索引文獻:
container of 函式簡介
在linux 核心程式設計中,會經常見到乙個巨集函式container of ptr,type,member 但是當你通過追蹤原始碼時,像我們這樣的一般人就會絕望了 這一堆都是什麼呀?函式還可以這樣定義?怎麼還有0呢?哎,算了,還是放棄吧。這就是核心大佬們厲害的地方,隨便兩行 就讓我們懷疑人生,凡是...
container of函式原理分析
container of cast a member of a structureout to the containing structure ptr the pointer to the member.指向成員變數的指標 type the type of the container struct...
關於container of等巨集的整理
一直很是疑惑container of是什麼意思,最近看了一些資料,整理一下。1 typeof 首先,我們要知道typeof,它是gcc的c語言擴充套件保留字,用於宣告變數型別。typeof的引數可以是兩種形式 表示式或型別。例如 typeof x 這裡假設x是乙個函式指標,這樣就可以得到這個函式返回...