在将当前的32位应用程序移植到64位的过程中,我添加了编译器选项/ we4302(请参阅SO Question Clarification: Porting 32 to 64 bit和Hans Passant建议的答案),我遇到了ATLMFC Include文件似乎具有指针截断的情况。
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ATLMFC\INCLUDE\afxtempl.h
(163) : error C4302: 'type cast' : truncation from 'CControlBar *' to 'long'
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ATLMFC\INCLUDE\afxtempl.h
(163) : error C4302: 'type cast' : truncation from 'HMENU ' to 'long'
我打算将编译器标志永久添加到我们的构建系统中,但是如果MFC Includes中存在问题,那将是个坏主意。
所以我的问题是
最佳答案
如果打开afxtempl.h头文件,则会在第163行找到以下代码:
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
// (algorithm copied from STL hash in xfunctional)
ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773); // *** error is on this line
HashVal.rem = 16807 * HashVal.rem - 2836 * HashVal.quot;
if (HashVal.rem < 0)
HashVal.rem += 2147483647;
return ((UINT)HashVal.rem);
}
转换为
(long)
在计算哈希码的方法内部。尽管这不是理想的方法(因为它可能会导致哈希冲突),但在计算哈希码时丢弃前32位并不是错误。因此,这是一个您可以忽略的虚假警告。我会在您本地的开发箱上使用
/we4302
来查找并修复所有实际错误;最终可能会有太多误报,无法在构建服务器上启用它。关于c++ - 如何处理ATLMFC包含文件中的指针截断?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15176168/