offsetof宏和container_of宏
生活随笔
收集整理的這篇文章主要介紹了
offsetof宏和container_of宏
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1 offsetof宏
- 1.1 宏的作用
- 1.2 編譯器做了什么
- 2 container_of宏
- 2.1 ({})是什么?
- 2.2 typeof
- 2.3 原理分析
1 offsetof宏
1.1 宏的作用
offsetof用于計(jì)算TYPE結(jié)構(gòu)體中MEMBER成員的偏移位置。
1.2 編譯器做了什么
注意: 在操作系統(tǒng)的環(huán)境下,讀和寫0地址的內(nèi)容都是非法的,會(huì)導(dǎo)致程序異常停止。
對于編譯器來說,它清楚的知道結(jié)構(gòu)體成員變量的偏移地址,它通過結(jié)構(gòu)體變量首地址與偏移量來定位成員變量。所以對于offsetof宏來說編譯器并不會(huì)去讀寫0地址,而是直接計(jì)算得到成員的地址,所以直接使用0地址不會(huì)導(dǎo)致程序崩潰。
2 container_of宏
2.1 ({})是什么?
({})是GNU C編譯器的擴(kuò)展語法,與逗號(hào)表達(dá)式類似,結(jié)果為最后一個(gè)語句的值。
2.2 typeof
typeof是GUN C編譯器特有的關(guān)鍵字,只在編譯期有效,用于得到變量的類型。
2.3 原理分析
我們可以分析出container_of宏的作用就是根據(jù)結(jié)構(gòu)體成員的地址得到結(jié)構(gòu)體的首地址。
注意: container_of使用({})進(jìn)行安全類型的檢查,這里設(shè)計(jì)的非常精妙。宏的第一句并不是無用的,而是用來進(jìn)行類型檢查的。
總結(jié)
以上是生活随笔為你收集整理的offsetof宏和container_of宏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FFMpeg的基本用法
- 下一篇: IP协议的输入处理