代码之家  ›  专栏  ›  技术社区  ›  Abhijit

澄清:移植32到64位

  •  3
  • Abhijit  · 技术社区  · 11 年前

    引用自 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位代码?

    3 回复  |  直到 11 年前
        1
  •  6
  •   Community uzul    7 年前

    这太粗鲁了。只要让编译器为您做这项工作,启用警告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编译选项对于嗅探来说也很有用,但它 has problems .

        2
  •  2
  •   Mats Petersson    11 年前

    您只需要使用 INT_PTR UINT_PTR 如果您计划在变量中存储指针(包括各种形式的 HANDLE ). 如果它只是一个正则积分值,那么它就无关紧要了。

    我预计,如果你盲目地翻译所有类型,你至少会收到一些“试图将较大类型存储在较小类型中”的警告 DWORD UINT_PTR 。[也就是说,当您编译64位代码时,就像在32位代码中一样,类型 UINT_PTR 双字 因此,在这种情况下,您可能不会收到任何警告]。

        3
  •  1
  •   SomeWittyUsername    11 年前

    添加@MatsPetersson答案-

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

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

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