【发布时间】:2017-03-28 09:28:39
【问题描述】:
我注意到我的 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_t 与 size_t 的类型不同。如果我不想添加演员表,我应该如何纠正这个问题?
【问题讨论】:
-
也许是你的函数有错误的签名:-)
-
size_t是计数类型,uintptr_t是位置类型。offsetof返回后者是没有意义的,不管它是如何实现的。 -
如果在 POSIX 上并且您在文件偏移后使用
off_t定义为<fcntl.h>/<sys/types.h> -
附带说明:您似乎正在使用结构在闪存上存储/读取数据。这不像进行适当的序列化那样可扩展。每当您需要使用
offsetof时,您应该重新考虑您的设计。旨在尽量减少对结构布局的依赖。 -
uintptr_t是一种用于指针转换的类型,而不是算术类型。如果您想将偏移量视为地址的差异,您应该使用prtrdiff_t。