3

引用自http://msdn.microsoft.com/en-us/library/windows/desktop/aa384242%28v=vs.85%29.aspx

在适当的情况下使用 UINT_PTR 和 INT_PTR(如果您不确定是否需要它们,使用它们以防万一)。不要将指针转换为 ULONG、LONG、INT、UINT 或 DWORD 类型。

我可以安全地假设在现有的 32 位代码行中将所有引用的 DWORD 转换为 UNIT_PTR 是安全的,没有任何副作用吗?

是否有其他推荐的指南来移植在代码行中引用 DWORD 的 32 位代码?

4

3 回答 3

6

这太粗暴了。只需让编译器为您完成工作,启用警告 4302,以便它会在指针值被截断时告诉您。将#pragma 放在一个好位置,预编译的头文件将是理想的。或者指定/we4302编译器选项。

#pragma warning(default:4302)

int main()
{
    int* p = 0;
    long bad = (long)p;    // C4302: 'type cast' : truncation from int* to long
    return 0;
}

/Wp64 编译选项也很有用,无论如何用于嗅探,但它有问题

于 2013-02-26T19:50:02.937 回答
2

您只需要使用INT_PTRorUINT_PTR如果您打算在变量中存储一个指针(包括各种形式的HANDLE)。如果它只是一个常规的整数值,那就没关系了。

如果你盲目地将 all 翻译DWORDUINT_PTR. [也就是说,当您编译 64 位代码时,与 32 位代码一样,类型UINT_PTR相同,DWORD因此在这种情况下您可能不会收到任何警告]。

于 2013-02-26T19:01:18.383 回答
1

要添加@MatsPetersson 答案 -

广泛用于保存地址的原因DWORD是它与 32 位架构上的指针大小相匹配。

最佳实践是对保存地址的变量使用专用类型。这就是UINT_PTR&INT_PTR的用途——它们对于 32 位和 64 位目标都是正确的,因为它们的定义是根据编译目标正确设置的。实际上,您可以浏览 MS 标头并亲自查看这些类型对应的实际原始类型。

每当变量用于地址以外的数据时,实际类型应根据存储的数据定义,通常不依赖于底层计算机体系结构 -DWORD将保留DWORDWORD将保留WORD等。

于 2013-02-26T19:17:44.943 回答