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

时间:2013-03-02 15:31:57

标签: c++ windows visual-c++ mfc atl

在将当前32位应用程序移植到64位的过程中,我添加了编译器选项/ we4302(请参阅SO Question Clarification: Porting 32 to 64 bitHans 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包含中遇到问题,那将是一个坏主意。

所以我的问题是

  1. 报告的问题是否是错误警告?
  2. 如果这确实导致指针截断,建议的解决方案是什么
  3. 在构建系统中添加编译器选项/ we4302是一个坏主意吗?

2 个答案:

答案 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,我发现:

A Comprehensive comparison of the MFC & ATL changes in VS 2015 RC compared to Visual Studio 2013 Update 4 (Part 1)

  

......

     
      
  • afxtempl.h

         

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

  •   

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