名稱空間
變體
操作

offsetof

來自 cppreference.com
< c‎ | 型別
定義於標頭檔案 <stddef.h>
#define offsetof(type, member) /*實現定義*/

offsetof 擴充套件為一個 整數常量表達式,型別為 size_t,其值為指定型別物件到其指定子物件的位元組偏移量,包括任何填充。

給定一個具有靜態儲存期、型別為 type 的物件 o&(o.member) 應當是一個地址常量表達式並指向 o 的一個子物件。否則,行為是未定義的。

如果 type 中指定的型別名包含逗號,且該逗號不在匹配的括號之間,則行為是未定義的。

(自 C23 起)

目錄

[編輯] 注意

如果 offsetof 應用於位域成員,則行為是未定義的,因為不能獲取位域的地址。

member 不限於直接成員。它可以表示給定成員的子物件,例如陣列成員的元素。

儘管 C23 規定在 offsetof 中指定包含未加括號的逗號的新型別是未定義行為,但即使在早期模式下,這種用法通常也不受支援:offsetof(struct Foo { int a, b; }, a) 通常編譯失敗。

typeof 可用於避免新型別定義中逗號的不良影響,例如 offsetof(typeof(struct { int i, j; }), i) 是定義良好的。

(自 C23 起)

[編輯] 示例

#include <stdio.h>
#include <stddef.h>
 
struct S {
    char c;
    double d;
};
 
int main(void)
{
    printf("the first element is at offset %zu\n", offsetof(struct S, c));
    printf("the double is at offset %zu\n", offsetof(struct S, d));
}

可能的輸出

the first element is at offset 0
the double is at offset 8

[編輯] 缺陷報告

以下行為改變的缺陷報告被追溯地應用於以前釋出的 C 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
DR 496 C89 只提及了結構和結構成員 聯合體及其他子物件也受支援

[編輯] 另請參閱

sizeof 運算子返回的無符號整型
(typedef) [編輯]
C++ 文件,關於 offsetof