为什么需要类型铸件(UINT)(void*)(DWORD)?

dul*_*shi 5 c c++ mfc casting

这是MFC的CMap类中的默认HashKey函数.

AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
??// default identity hash - works for most primitive values
??return ((UINT)(void*)(DWORD)key) >> 4;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么需要类型转换(DWORD)(void*)?我猜(DWORD)可能与16位机器的兼容性事务有一些关系.但我对虚空*感到困惑.

Han*_*ant 8

template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
    // default identity hash - works for most primitive values
    return (DWORD)(((DWORD_PTR)key)>>4);
}
Run Code Online (Sandbox Code Playgroud)

这就是今天的功能.您的版本来自一个非常旧版本的MFC,足以支持16位程序.MFC于1992年首次发布,即Windows版本3的时代.MFC版本1.0到2.5支持16位目标.该函数的当前版本适用于32位和64位代码.

在16位代码中,一个选择的选项是内存模型.你可以选择便宜的16位指针或昂贵的32位指针.因此额外的void*cast会将值修剪为内存模型大小.