为什么offsetof返回size_t而不是uintptr_t?

时间:2017-03-28 09:28:40

标签: c pointers c99

我注意到我对offsetof的实现:

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

返回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的类型不同。如果我不想添加演员,我该如何纠正?

1 个答案:

答案 0 :(得分:7)

size_t是一种无符号整数类型,可以保存系统中最大对象的大小。

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

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

uintptr_t还用于保存转换为整数值的地址。这是保持绝对位置,而不是偏离某些未指定的位置。此外,该标准没有要求如何完成address->integral value->address之间的映射。它只要求两端的地址相同。

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