offsetof
|
定义于头文件
<stddef.h>
|
||
|
#define offsetof(type, member) /*implementation-defined*/
|
||
宏 offsetof 展开为类型 size_t 的 整数常量表达式 ,其值表示从指定类型对象的起始位置到其指定子对象的字节偏移量(包括可能存在的填充字节)。
给定一个具有静态存储期的
type
类型对象
o
,
&
(
o.
member
)
应当是一个地址常量表达式并指向
o
的子对象。否则,其行为是未定义的。
|
如果在
|
(since 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) |
|
|
C++ documentation
for
offsetof
|
|