2015-10-29 110 views
-1
#define container_of(ptr, type, member) ({  \ 
     const typeof(((type *)0)->member) *__mptr = (ptr); \ 
     (type *)((char *)__mptr - offsetof(type,member));}) 

宏container_of中的'0'對我來說完全是未知的。它是c語言還是某種類型的gcc擴展?宏container_of中0的含義是什麼?

希望有一個簡單的例子來解釋這個'0'。

回答

3

這實際上是implementation defined behaviour。它將一個整數轉換爲一個指針。請注意,這不是而是 a null pointer constant,因爲它不是void *,而是另一種類型。

該轉換有效地生成一個指向地址爲0的類型爲type的對象的指針。因爲這從來沒有被訪問,所以這不是未定義的行爲。原因是爲以下offsetof生成引用對象,並向宏添加一些類型檢查。 AFAIK,這個宏來自Linux內核並且使用頻率很高(我自己在自己的代碼中使用它 - 非常有用,謝謝你們!)。它使用了一些gcc擴展,但這是塊表達式(parethetised大括號)和typeof,而不是演員。

Here是宏的詳細描述。

+2

順便說一句,你的第二個鏈接說:「一個整數常量表達式的值爲0,或者這樣一個表達式轉換爲類型void *,被稱爲空指針常量」,我讀的方式是轉換不需要。 「指針上下文」中的零是一個空指針常量。 – unwind

+0

@unwind:不,因爲在這種情況下它被取消引用,所以你首先需要一個指針。嘗試'0-> member',你會得到一個編譯器錯誤,因爲'0'實際上不是一個指針上下文,(上下文)只是由該強制建立。指針上下文將是例如對指針進行強制轉換的表達式。正如我在對你的回答的評論中所寫的那樣:這是UB的邊緣(雖然不知道從哪邊來),而且必須精確。所以 – Olaf

+2

你是不是現在聲稱它已被解除引用(在你的評論中)而且它不是,在你的實際答案文本中? – unwind

相關問題