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) |