在将当前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包含中遇到问题,那将是一个坏主意。
所以我的问题是
答案 0 :(得分:2)
如果打开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
来查找并修复所有真正的错误;可能最终只有太多的误报才能在构建服务器上启用它。
答案 1 :(得分:0)
要添加到Bradley's answer,我发现:
......
afxtempl.h
第164行:模板函数HashKey现在压制C4311 编译错误
所以看来他们最终在VS 2015中修复了它。