[英]Why offsetof returns a size_t instead of an uintptr_t?
我注意到我的offsetof的实现:
#define offsetof(st, m) ((size_t)&(((st *)0)->m))
返回size_t
,但我认为应该改为uintptr_t
因为offsetof的值将最有可能用于增加指针。
我有这个功能:
int flash_seek(intptr_t offset32, int whence);
它将闪存的内部指针移动到另一个位置。 所以offset32
是一个偏移量。 如果我想将指针从结构的偏移量移开:
flash_seek(offsetof(foo_t, bar), SEEK_CUR);
我收到警告,因为uintptr_t
与size_t
类型不同。 如果我不想添加演员表,应该如何纠正?
size_t
是无符号整数类型,可以容纳系统上最大对象的大小。
这使其成为可能是系统中最大结构中最后一个成员的偏移量的理想候选者。
还需要在任何符合标准的C标准库实现中进行定义。 uintptr_t
是可选的。
uintptr_t
还用于保存转换为整数值的地址。 它要保留一个绝对位置,而不是偏离一些未指定位置的位置。 此外,该标准对如何完成address->integral value->address
数值- address->integral value->address
之间的映射没有任何要求。 仅要求两端的地址相同。
为什么主要归结为size_t
和uintptr_t
是完全不同的事物的抽象的答案, 需要定义前者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.