歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

關於Linux內核中的container_of宏

在Linux內核中廣泛了應用了offsetof()宏和container_of()宏,offsetof()相對比較簡單就不贅述了,主要講講對container_of()宏的一些疑惑,其作用是根據結構體內部某個成員的指針反推出整個結構體的地址,對於內核鏈表來說非常有用。

在linux內核中,對container_of是這樣定義的

#define container_of(ptr, TYPE, MEMBER) ({const typeof(((TYPE *)0)->MEMBER) *__ptr = (ptr);\

(TYPE *)((char *)__ptr - offsetof(TYPE, MEMBER));})

1.將地址0強轉成type *指針,取到成員member指針,然後再使用typeof來獲取到member的類型,將結構體中變量ptr的指針保存到__ptr.

2.使用offsetof宏獲取到member變量相對於結構體type的偏移量,這樣將__mptr的值減去偏移量即是結構體的地址,然後再強轉即得到結構體指針。

但我仔細研究發現,其實如果沒有第一句代碼,只有第二句代碼同樣可以得到想要的結果,對此一直對第一句代碼覺得疑惑,不知道這樣做的含義是什麼,因為在linux中不可能會有多余無用的代碼。而網上大批關於講述container_of宏的博客大多沒有講第一句代碼存在的含義,都只是解釋了代碼的作用而已。

直到看到一篇博客寫到使用__ptr的目的是在編譯期間進行類型檢測(第一句,賦值時如果類型不匹配會報告警),保證傳入的成員地址與成員類型是匹配的,而在運行期間則和忽略中間變量__ptr是一樣的。至此,疑惑全然解開,果然還是自己太年輕,想法不夠成熟。

參考地址 http://www.linuxidc.com/Linux/2016-08/134479.htm

Copyright © Linux教程網 All Rights Reserved