问题描述
我经常看到(例如在Linux内核中)unsigned long
用于保存指针。考虑到指针的大小可能大于整数类型(包括long),我不知道这是什么原因。
在Linux用户空间应用程序中将指针保留在unsigned long
中而不是uintptr_t
中可移植吗? (尽管我知道uintptr_t
保证可以从void *
转换为uintptr
整数并返回,而不会丢失信息)
谢谢。
解决方法
在Linux用户空间应用程序中将指针保留在
unsigned long
中而不是uintptr_t
中可移植吗? (尽管我知道uintptr_t
保证可以从void *
转换为uintptr
整数并返回,而不会丢失信息)
“是”,它可以在Linux的任何当前端口上使用,并且将来很有可能。但为什么?有一个非常好的typedef也可以指定意图:uintptr_t
-它也使您的代码也可以移植到Win64。
uintptr_t
是C99的发明,Linux早于C99。那时还没有约定用于指定足以容纳指针的整数-但是,除了编译器扩展之外,也没有unsigned long long
,因此unsigned long
就是您可以合理预期持有的全部一个指针,如果有的话,也是如此。到目前为止,对于运行Linux的任何新体系结构,都需要选择long
的类型,以便它足以容纳指针size_t
等。
当64位Windows出现时,太多情况依赖于unsigned long
的某种表示形式,并且它仍然保留为32位,而不是保存指针所需的类型。据我所知,今天所有相关平台在Win64 unsigned long
上仅 不够宽,无法容纳指针。