offsetof
来自 cppreference.com
定义在头文件 <stddef.h> 中 |
||
#define offsetof(type, member) /*implementation-defined*/ |
||
宏 offsetof 展开为一个类型为 size_t 的 整数常量表达式,其值为从指定类型的对象的开头到其指定子对象的偏移量(以字节为单位),包括任何填充。
对于具有静态存储期的指定类型的对象 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 运算符返回的无符号整数类型 (typedef) | |
C++ 文档 for offsetof
|