欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言宏函數(shù)container of()簡介

 更新時間:2021年12月18日 16:05:39   作者:叨陪鯉  
這篇文章介紹了C語言宏函數(shù)container of(),對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在linux 內(nèi)核編程中,會經(jīng)常見到一個宏函數(shù)container_of(ptr,type,member), 但是當你通過追蹤源碼時,像我們這樣的一般人就會絕望了(這一堆都是什么呀? 函數(shù)還可以這樣定義??? 怎么還有0呢??? ?哎,算了,還是放棄吧。。。)。 這就是內(nèi)核大佬們厲害的地方,隨便兩行代碼就讓我們懷疑人生,凡是都需要一個過程,慢慢來吧。

其實,原理很簡單: ?已知結(jié)構(gòu)體type的成員member的地址ptr,求解結(jié)構(gòu)體type的起始地址。

type的起始地址 = ptr - size (這里需要都轉(zhuǎn)換為char *,因為它為單位字節(jié))。

到此,該函數(shù)已經(jīng)講完,是不是很簡單??? 其實也不是,這里并沒有提到size如何計算,而令我們頭暈的正是這里。

好吧,先上container of函數(shù)原型:

#define container_of(ptr, type, member) ({              \         
const typeof( ((type *)0)->member ) *__mptr = (ptr);    \         
(type *)( (char *)__mptr - offsetof(type,member) );})

其次為 offserof 函數(shù)原型:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

怎么樣,是不是很炫? ?好吧,下面開始揭開面紗:

(一)0 指針的使用 ? ?(自己給的名字,不知有木問題)

讓事實說話:

#include<stdio.h>
 
struct test
{
	char i ;
	int j;
	char k;
};
 
int main()
{
	struct test temp;
	printf("&temp = %p\n",&temp);   
	printf("&temp.k = %p\n",&temp.k);
	printf("&((struct test *)0)->k = %d\n",((int)&((struct test *)0)->k));
 
}

編譯運行,可以得到如下結(jié)果:

&temp = 0xbf9815b4
&temp.k = 0xbf9815bc
&((struct test *)0)->k = 8

什么意思看到了吧,自定義的結(jié)構(gòu)體有三個變量:i,j,k。 因為有字節(jié)對齊要求,所以該結(jié)構(gòu)體大小為4bytes * 3 =12 bytes. ? 而&((struct test *)0)->k 的作用就是求 k到結(jié)構(gòu)體temp起始地址的字節(jié)數(shù)大小(就是我們的size)。在這里0被強制轉(zhuǎn)化為struct test *型, 它的作用就是作為指向該結(jié)構(gòu)體起始地址的指針,就是作為指向該結(jié)構(gòu)體起始地址的指針,就是作為指向該結(jié)構(gòu)體起始地址的指針, 而&((struct test *)0)->k ?的作用便是求k到該起始指針的字節(jié)數(shù)。。。其實是求相對地址,起始地址為0,則&k的值便是size大小(注:打印時因為需要整型,所以有個int強轉(zhuǎn))所以我們便可以求我們需要的 size 了 ?。 好吧,一不小心把 offsetof() 函數(shù)的功能給講完了:::

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

這次再看就順眼了吧(底層為什么是這樣我還是不懂。。。只知道這樣確實可以) , ?所以offsetof()的作用就是求我們夢寐以求的size, 并以size_t形式返回(size_t: 無符號整型)。

(二)內(nèi)核編程的嚴謹性

#define container_of(ptr, type, member) ({              \         
const typeof( ((type *)0)->member ) *__mptr = (ptr);    \         
(type *)( (char *)__mptr - offsetof(type,member) );})

這里我們只看第二行:

const typeof( ((type *)0)->member ) *__mptr = (ptr);  

它的作用是什么呢? 其實沒什么作用(勿噴勿噴,讓我把話說完),但就形式而言 _mptr = ptr, ?那為什么要要定義一個一樣的變量呢??? 其實這正是內(nèi)核人員的牛逼之處:如果開發(fā)者使用時輸入的參數(shù)有問題:ptr與member類型不匹配,編譯時便會有warnning, 但是如果去掉改行,那個就沒有了,而這個警告恰恰是必須的(防止出錯有不知道錯誤在哪里)。。。這嚴謹性可以吧

typeof( ((type *)0)->member )

它的作用是獲取member的類型僅此而已。至此基本結(jié)束

(三) 總結(jié)

container_of(ptr, type,member)函數(shù)的實現(xiàn)包括兩部分:

  • 1.判斷ptr 與 member 是否為同意類型
  • 2.計算size大小,結(jié)構(gòu)體的起始地址 = (type *)((char *)ptr - size) ? (注:強轉(zhuǎn)為該結(jié)構(gòu)體指針)

現(xiàn)在我們知道container_of()的作用就是通過一個結(jié)構(gòu)變量中一個成員的地址找到這個結(jié)構(gòu)體變量的首地址。

container_of(ptr,type,member),這里面有ptr,type,member分別代表指針、類型、成員。

到此這篇關(guān)于C語言宏函數(shù)container of()簡介的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言類的雙向鏈表詳解

    C語言類的雙向鏈表詳解

    大家好,本篇文章主要講的是C語言類的雙向鏈表詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場景

    詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場景

    這篇文章主要介紹C++ 參數(shù)的三種傳遞方式和應(yīng)用場景,C++ 參數(shù)的三種傳遞方式分別是值傳遞、指針傳遞和引用傳遞,感興趣的同學可以參考閱讀下
    2023-06-06
  • C語言標準時間與秒單位相互轉(zhuǎn)換

    C語言標準時間與秒單位相互轉(zhuǎn)換

    這篇文章主要介紹了C語言標準時間與秒單位相互轉(zhuǎn)換,秒單位與標準時間的轉(zhuǎn)換方式,這份代碼一般用在嵌入式單片機里比較多,比如:設(shè)置RTC時鐘的時間,從RTC里讀取秒單位時間后,需要轉(zhuǎn)換成標準時間顯示。下文分享需要的小伙伴可以參考一下
    2022-05-05
  • C++實現(xiàn)區(qū)塊鏈的源碼

    C++實現(xiàn)區(qū)塊鏈的源碼

    這篇文章主要介紹了C++實現(xiàn)區(qū)塊鏈的源碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • C++中Boost.Chrono時間庫的使用方法

    C++中Boost.Chrono時間庫的使用方法

    chrono是一個time library, 源于boost,現(xiàn)在已經(jīng)是C++11標準了,下面這篇文章主要給大家介紹了關(guān)于C++中Boost.Chrono時間庫的使用方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • C++基礎(chǔ)學習之輸入輸出流詳解

    C++基礎(chǔ)學習之輸入輸出流詳解

    C++是一種廣泛應(yīng)用的編程語言,其輸入和輸出是程序所必須的基本操作之一。本文將介紹C++中的輸入和輸出操作,包括輸入輸出流、文件輸入輸出等,希望對讀者有所幫助
    2023-04-04
  • 使用VS2019編譯CEF2623項目的libcef_dll_wrapper.lib的方法

    使用VS2019編譯CEF2623項目的libcef_dll_wrapper.lib的方法

    這篇文章主要介紹了使用VS2019編譯CEF2623項目的libcef_dll_wrapper.lib的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • C語言淺析函數(shù)的用法

    C語言淺析函數(shù)的用法

    C語言函數(shù)是用來模塊化構(gòu)建程序的。如果你的功能少,你可以全都寫在mian函數(shù)中,但是當實現(xiàn)功能多的時候,如果全寫在main的函數(shù)里,不僅代碼不美觀,而且函數(shù)實現(xiàn)的時候結(jié)構(gòu)復(fù)雜,代碼重復(fù)
    2022-07-07
  • OpenCV圖像處理之實現(xiàn)圖像膨脹腐蝕操作

    OpenCV圖像處理之實現(xiàn)圖像膨脹腐蝕操作

    圖像形態(tài)學操作是指基于形狀的一系列圖像處理操作的合集,主要是基于集合論基礎(chǔ)上的形態(tài)學數(shù)學對圖像進行處理。本文將為大家介紹一下如何利用OpenCV實現(xiàn)其中的腐蝕和膨脹操作,需要的可以參考一下
    2022-09-09
  • C語言實現(xiàn)逆序輸出詳細

    C語言實現(xiàn)逆序輸出詳細

    這篇文章主要介紹了C語言實現(xiàn)逆序輸出。主要實現(xiàn)C語言實現(xiàn)對數(shù)組元素依次賦值然后按照逆序輸出,下面文章小編將詳細解說,需要的朋友可以參考一下
    2021-10-10

最新評論