offsetof
来自 cppreference.cn
定义于头文件 <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 | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
DR 496 | C89 | 仅提及了结构体和结构体成员 | 也支持联合体和其他子对象 |
[编辑] 参见
由 sizeof 运算符返回的无符号整数类型 (类型定义) | |
C++ 文档 关于 offsetof
|