在将我当前的32位应用程序移植到64位的过程中,我添加了编译器选项/ we4302(参考SO 问题说明:移植32位到64位以及Hans Passant的build议答案),我遇到了ATLMFC包含文件似乎有指针截断。
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'
我打算将编译器标志永久添加到我们的构build系统,但是如果我们在MFC包含中存在问题,这将是一个坏主意。
所以我的问题是
如果你打开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
来查找和修复所有真正的错误; 最终可能会在构建服务器上出现过多的误报。
为了补充布拉德利的回答 ,我发现:
……
afxtempl.h
第164行:模板函数HashKey现在抑制了C4311编译器错误
所以看来他们终于在VS 2015中修复了。