我今天在工作场所学到了这一点。在发布我的问题之前,我阅读了这个、这个和这个。
这是我的高级同事告诉我的:
您不能将 void* 分配给 UINT 或 unsigned int。它不适用于 64 位。
但为什么?是因为在不同的架构void*
上unsigned int
承载不同的大小(如其他问题中所述),还是其他原因?
是的,就是这样。
但是,您的实现可能会提供可选的 type uintptr_t
,其定义如下:
以下类型指定了一个无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为此类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:
uintptr_t
签署的副本intptr_t
也可能可用。这些类型在<cstdint>
标题中可用。
通过选择使用这些类型,您承认您的代码将仅与在您的目标机器上提供此类型的实现子集一起编译。
尺寸显然是个障碍,如果void*
身体不能适应unisigned int
游戏就结束了。但即使sizeof(void*) == sizeof(unsigned int)
您有类型兼容性问题:一个持有数据指针,另一个持有数据。你必须reinterpret_cast<>()
一个对另一个,所有的赌注都是关于这将如何运作的。
取决于您的应用程序的目标。您标记VC++
并提及类型UINT
- 因此您似乎正在为 Windows 构建。在 32 位 Windows 中,指针大小为 32 位,而在 64 位 Windows 中,指针大小为 64 位。但是,UINT
对于这两种 Windows 风格,类型大小的定义类似于 32 位。您可以使用__uint64
或UINT64
特定于 MS 的类型而不是 UINT 以确保它对于您的指针足够大。您还可以使用专门设计用于匹配指针大小的INT_PTR
/UINT_PTR
类型(从而使其对 32/64 位风格透明)。
有关各种数据类型的参考,请参阅http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx。
当然,所有这些都会使您的程序无法原生地移植到其他架构/操作系统。