Namespaces
Variants

offsetof

From cppreference.net
< c ‎ | types
定义于头文件 <stddef.h>
#define offsetof(type, member) /*implementation-defined*/

offsetof 展开为类型 size_t 整数常量表达式 ,其值表示从指定类型对象的起始位置到其指定子对象的字节偏移量(包括可能存在的填充字节)。

给定一个具有静态存储期的 type 类型对象 o & ( o. member ) 应当是一个地址常量表达式并指向 o 的子对象。否则,其行为是未定义的。

如果在 type 中指定的类型名称包含不在匹配括号内的逗号,则行为未定义。

(since 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++ documentation for offsetof