2015-08-28 34 views
0

我想了解在c抵消宏觀和有問題試圖解釋這個解碼抵消宏觀

&((type *)0)

#define offsetof(type, member) ((size_t) &((type *)0)->member)

如何閱讀它。我理解這個術語的功能,但不是這個術語的確切解釋。

感謝

回答

3

這個預處理宏的擴展:

#define offsetof(type, member) ((size_t) &((type *)0)->member) 

結果在下面的正式定義:offsetof給定member在給定type是鑄件的地址size_tmember成員type位於空指針地址。或者,換句話說,這是一種黑魔法,它獲得member的地址,就好像type的對象存在於空指針地址(注意:只要沒有讀或寫在這裏發生就沒有崩潰)。由於這樣一個成員的地址現在是絕對的(相對於零),其值可以安全地輸出到size_t,因此有效地評估這樣的一個絕對值的這種member的偏移量。

希望這會有所幫助!

+0

如果空指針與值「0」不相同,則會遇到麻煩。標準確實讓這一點很好。所以,我不會稱之爲「黑魔法」,而是「骯髒(但經常工作)的黑客」。已經取代C11。 – Olaf

+2

@Olaf:好吧,我對「黑魔法」和「污垢(但經常工作)黑客」有相同的定義。你說得對,空指針不一定等於零。但是'offsetof'是無論如何都是實現定義的,所以我們假定在OP正在調查的平臺中,空指針的值爲零。 – 3442

-2

採取看看這個代碼:

type *x = 0; 
size_t y = &x->member; 

通常情況下,y將等於x+offset,但由於x=0,我們只得到抵消。

在代碼我們寫((type *)0) - 直接返回指針type類型0,而不產生x變量,則我們取構件((type *)0)->member)的地址。所有這些被定義爲size_t變量。