C++ 如何处理ATLMFC包含文件中的指针截断?
在将当前32位应用程序移植到64位的过程中,我添加了编译器选项/we4302(请参阅SO和建议的答案),我遇到了一个场景,其中ATLMFC Include文件似乎具有指针截断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
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中遇到问题,那将是一个坏主意
所以我的问题是
如果打开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类型,所以我真的不知道。