Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理ATLMFC包含文件中的指针截断?_C++_Windows_Visual C++_Mfc_Atl - Fatal编程技术网

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

C++ 如何处理ATLMFC包含文件中的指针截断?,c++,windows,visual-c++,mfc,atl,C++,Windows,Visual C++,Mfc,Atl,在将当前32位应用程序移植到64位的过程中,我添加了编译器选项/we4302(请参阅SO和建议的答案),我遇到了一个场景,其中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:\P

在将当前32位应用程序移植到64位的过程中,我添加了编译器选项/we4302(请参阅SO和建议的答案),我遇到了一个场景,其中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);
    }
    
    模板
    AFX_内联UINT AFXAPI哈希键(ARG_键)
    {
    //(从xFunction中的STL哈希复制的算法)
    ldiv_t HashVal=ldiv((长)(ARG_键)键,127773);//***此行有错误
    HashVal.rem=16807*HashVal.rem-2836*HashVal.quot;
    如果(HashVal.rem<0)
    HashVal.rem+=2147483647;
    返回((UINT)HashVal.rem);
    }
    
    (long)
    的强制转换在计算哈希代码的方法中。虽然这并不理想(因为它可能会导致哈希冲突),但在计算哈希代码时丢弃前32位并不是错误。因此,这是一个可以忽略的虚假警告

    我会在您的本地开发框中使用
    /we4302
    查找并修复所有实际错误;最终可能会出现太多的误报,无法在构建服务器上启用它。

    要补充,我发现:

    • afxtempl.h

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


    看来他们终于在VS 2015中解决了这个问题。

    使用MS编译器,32位和64位模式下的
    long
    都是32位。这意味着指针不合适,这肯定是个问题。另一方面,第163行似乎在计算哈希值
    ldiv_t HashVal=ldiv((长)(ARG_键)键,127773)其中key已经是ARG_key类型,所以我真的不知道。