使用C99标准(及以后版本),需要在头文件<stdint.h>
中提供某些类型。对于精确宽度,例如int8_t
,int16_t
等,它们是可选的,并且标准中解释了为什么这样做。
但是对于uintptr_t
和intptr_t
类型,它们也是可选的,但我没有看到它们作为必需类型而不是可选类型的原因。
在一些平台上,指针类型的大小比任何整数类型都大得多。我相信这样的平台例子包括使用虚拟指令集将所有指针定义为128位的IBM AS/400。另一个更近期的例子是Elbrus,它使用128位指针,这些指针是硬件描述符而不是普通地址。
uintptr_t
不够高效,拥有它也比没有更好。有些问题只能通过这种类型(以实现定义的方式)来解决。因此,优质的实现应该始终提供此类型。 - gezauintptr_t
始终可用,则使用它的程序可以更具可移植性,因为您不必担心它是否可用。在某些问题中,精确的转换并不重要。例如,异或链表。我认为高质量的实现应该做出预期的事情:例如,将1添加到TYPE *
应该与将sizeof(TYPE)
添加到转换后的整数相同(因此可以避免expr.add的未定义行为)。 - geza