我想了解在c抵消宏觀和有問題試圖解釋這個解碼抵消宏觀
&((type *)0)
在
#define offsetof(type, member) ((size_t) &((type *)0)->member)
如何閱讀它。我理解這個術語的功能,但不是這個術語的確切解釋。
感謝
我想了解在c抵消宏觀和有問題試圖解釋這個解碼抵消宏觀
&((type *)0)
在
#define offsetof(type, member) ((size_t) &((type *)0)->member)
如何閱讀它。我理解這個術語的功能,但不是這個術語的確切解釋。
感謝
這個預處理宏的擴展:
#define offsetof(type, member) ((size_t) &((type *)0)->member)
結果在下面的正式定義:的offsetof
給定member
在給定type
是鑄件的地址size_t
member
成員type
位於空指針地址。或者,換句話說,這是一種黑魔法,它獲得member
的地址,就好像type
的對象存在於空指針地址(注意:只要沒有讀或寫在這裏發生就沒有崩潰)。由於這樣一個成員的地址現在是絕對的(相對於零),其值可以安全地輸出到size_t
,因此有效地評估這樣的一個絕對值的這種member
的偏移量。
希望這會有所幫助!
採取看看這個代碼:
type *x = 0;
size_t y = &x->member;
通常情況下,y
將等於x+offset
,但由於x=0
,我們只得到抵消。
在代碼我們寫((type *)0)
- 直接返回指針type
類型0,而不產生x
變量,則我們取構件((type *)0)->member)
的地址。所有這些被定義爲size_t
變量。
如果空指針與值「0」不相同,則會遇到麻煩。標準確實讓這一點很好。所以,我不會稱之爲「黑魔法」,而是「骯髒(但經常工作)的黑客」。已經取代C11。 – Olaf
@Olaf:好吧,我對「黑魔法」和「污垢(但經常工作)黑客」有相同的定義。你說得對,空指針不一定等於零。但是'offsetof'是無論如何都是實現定義的,所以我們假定在OP正在調查的平臺中,空指針的值爲零。 – 3442