[英]What does the following macro do?
在qemu源代碼中,我有以下名為offsetof
宏。 有人可以告訴我它做什么嗎?
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
它以這種方式使用:
offsetof(CPUState, icount_decr.u32)
其中CPUState是一個結構。
我認為它提供了結構中成員的偏移量,但是我不確定。
編輯:是的,我知道發生了什么事。 CPUState的定義內部有一個宏,我錯過了它,其中包含變量icount_decr。
它獲取結構成員的偏移量。 這樣做是通過將地址零強制轉換為該類型的結構,然后獲取成員的地址。
您的想法是正確的! 宏的名稱也給出了很好的提示。 ;)
在§7.17/ 3中定義:
offsetof(type, member-designator)
它擴展為一個整數常量表達式,其類型為size_t
,其值是從其結構的開頭(由type 指定 )到結構成員(由member-designator指定 )的偏移量(以字節為單位)。 類型和成員代號應使
static type t;
然后表達式&(t.member-designator)
求值為一個地址常數。 (如果指定的成員是位字段,則行為未定義。)
因為該庫不一定必須遵循語言規則,所以實現可以隨意獲得結果。
因此,此特定實現的結果不是未定義的行為,因為您不必擔心它的實現方式。 (換句話說,您的實現保證了通過空指針獲取間接地址的定義是明確的。您當然不能在自己的程序中假設這一點。)
如果某個庫具有(重新)定義的offsetof
,則它們使您的程序行為未定義,應改用標准庫。 (假人。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.