如何处理指针截断在ATLMFC包括文件
How to handle Pointer Truncation in ATLMFC Include files?
在将我当前的32位应用程序移植到64位的过程中,我添加了编译器选项/we4302(请参阅SO问题澄清:将32位移植到64位以及Hans Passant建议的答案),我遇到了一个ATLMFC Include文件似乎有指针截断的场景。
c:Program Files (x86)Microsoft Visual Studio 10.0VCATLMFCINCLUDEafxtempl.h
(163) : error C4302: 'type cast' : truncation from 'CControlBar *' to 'long'
c:Program Files (x86)Microsoft Visual Studio 10.0VCATLMFCINCLUDEafxtempl.h
(163) : error C4302: 'type cast' : truncation from 'HMENU ' to 'long'
我打算将编译器标志永久地添加到我们的构建系统中,但如果我们在MFC Includes中有问题,那将是一个坏主意。
所以我的问题是
- 报告的问题是错误警告吗?
- 如果这确实导致指针截断,建议的解决方案是什么 在构建系统中添加编译器选项/we4302是一个坏主意吗?
如果您打开afxtemplate .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
来查找和修复所有真正的错误;最终可能会出现太多误报,无法在构建服务器上启用它。
除了布拉德利的回答,我还发现:
MFC的综合比较&;VS 2015 RC与Visual Studio 2013 Update 4的ATL变化(第一部分)
... ...
afxtempl.h
第164行:模板函数HashKey现在抑制C4311编译错误
所以看起来他们最终在VS 2015中修复了这个问题。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 为什么 cmake 许可证<>样式不包括?
- 计算平均值,不包括上次得分
- 从多个源构造一个对象,包括一个对象向量
- 在编译中包括 Botan 2
- 将值从另一个数组写入数组,不包括不需要的值 C++
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 包括C++头文件
- CPP 包括 Azure DevOps 中的目录设置
- 包括STL,而不会乱扔全球范围
- 如何反转我的输入,包括否定
- 包括没有完整路径的我的库
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- C++包括类名间距和类实例化
- 链接错误,包括我创建的相同头文件 - C++
- 标头,包括在 Swift 项目中使用C++文件时的错误
- 如果语句不包括文本行?
- 如何将字符串与结构(也包括字符串)进行比较?
- 如何处理指针截断在ATLMFC包括文件