offsetof
來自 cppreference.com
定義於標頭檔案 <stddef.h> |
||
#define offsetof(type, member) /*實現定義*/ |
||
宏 offsetof 擴充套件為一個 整數常量表達式,型別為 size_t,其值為指定型別物件到其指定子物件的位元組偏移量,包括任何填充。
給定一個具有靜態儲存期、型別為 type
的物件 o
,&(o.member) 應當是一個地址常量表達式並指向 o
的一個子物件。否則,行為是未定義的。
如果 |
(自 C23 起) |
目錄 |
[編輯] 注意
如果 offsetof
應用於位域成員,則行為是未定義的,因為不能獲取位域的地址。
member
不限於直接成員。它可以表示給定成員的子物件,例如陣列成員的元素。
儘管 C23 規定在 offsetof
中指定包含未加括號的逗號的新型別是未定義行為,但即使在早期模式下,這種用法通常也不受支援:offsetof(struct Foo { int a, b; }, a) 通常編譯失敗。
typeof 可用於避免新型別定義中逗號的不良影響,例如 offsetof(typeof(struct { int i, j; }), i) 是定義良好的。 |
(自 C23 起) |
[編輯] 示例
執行此程式碼
可能的輸出
the first element is at offset 0 the double is at offset 8
[編輯] 缺陷報告
以下行為改變的缺陷報告被追溯地應用於以前釋出的 C 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
DR 496 | C89 | 只提及了結構和結構成員 | 聯合體及其他子物件也受支援 |
[編輯] 另請參閱
由 sizeof 運算子返回的無符號整型 (typedef) | |
C++ 文件,關於 offsetof
|