1

在将我当前的 32 位应用程序移植到 64 位的过程中,我添加了编译器选项 /we4302(请参阅 SO Question Clarification: Porting 32 to 64 bit和Hans Passant的建议答案),我遇到了一个 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'

我计划将编译器标志永久添加到我们的构建系统中,但如果我们在 MFC 包含中遇到问题,那将是一个坏主意。

所以我的问题是

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

2 回答 2

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在您的本地开发框中使用来查找并修复所有真正的错误;最终可能会有太多误报而无法在构建服务器上启用它。

于 2013-03-02T16:48:58.587 回答
0

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

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

……

  • afxtempl.h

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

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

于 2016-05-09T07:41:18.820 回答