簡體   English   中英

以下宏做什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM