在将当前的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 Includes中存在问题,那将是个坏主意。

所以我的问题是
  • 报告的问题是错误的警告吗?
  • 如果确实导致指针截断,建议的解决方案是
  • 在构建系统中添加编译器选项/ 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来查找并修复所有实际错误;最终可能会有太多误报,无法在构建服务器上启用它。

    关于c++ - 如何处理ATLMFC包含文件中的指针截断?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15176168/

    10-08 21:01