如何处理ATLMFC包含文件中的指针截断?

在将我当前的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包含中存在问题,这将是一个坏主意。

所以我的问题是

  1. 报告的问题是否是虚假警告?
  2. 如果这确实会导致指针截断,那么build议的解决scheme是什么?
  3. 在编译系统中添加编译器选项/ we4302是不是一个好主意?

如果你打开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来查找和修复所有真正的错误; 最终可能会在构建服务器上出现过多的误报。

为了补充布拉德利的回答 ,我发现:

与Visual Studio 2013 Update 4(第1部分)相比,VS 2015 RC中的MFC和ATL更改的综合比较

……

  • afxtempl.h

    第164行:模板函数HashKey现在抑制了C4311编译器错误

所以看来他们终于在VS 2015中修复了。