为什么 offsetof returns a size_t 而不是 uintptr_t?

Why offsetof returns a size_t instead of an uintptr_t?

我注意到我实现了 offsetof:

#define offsetof(st, m) ((size_t)&(((st *)0)->m))

Returns a size_t,但我认为应该改为 uintptr_t,因为 offsetof 的值最有可能用于递增指针。

我有这个功能:

int flash_seek(intptr_t offset32, int whence);

它将FLASH的内部指针移动到另一个位置。所以 offset32 是一个偏移量。如果我想将指针从结构的偏移量移开:

flash_seek(offsetof(foo_t, bar), SEEK_CUR);

我收到一条警告,因为 uintptr_tsize_t 的类型不同。如果我不想添加演员,我应该如何更正此问题?

size_t 是一个无符号整数类型,可以容纳系统上最大对象的大小。

这使得它成为保存系统上可能是最大结构中最后一个成员的偏移量的完美候选者。

它也需要在任何符合 C 标准库的实现上定义。 uintptr_t 是可选的。

A uintptr_t 也用于保存转换为整数值的地址。它是为了保存一个绝对位置,而不是某个未指定位置的偏移量。此外,该标准对如何完成 address->integral value->address 之间的映射没有任何要求。只要求两端地址相同即可。

为什么的答案主要归结为size_tuintptr_t是对完全不同事物的抽象,前者是要求 待定义。