c – 有关“警告C4312:’type cast’”的问题

前端之家收集整理的这篇文章主要介绍了c – 有关“警告C4312:’type cast’”的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的代码
HWND WebformCreate(HWND hParent,UINT id)
{
    return CreateWindowEx(0,WEBFORM_CLASS,_T("about:blank"),WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,100,hParent,(HMENU)id,GetModuleHandle(NULL),0);
}

这是我收到的警告:

warning C4312: 'type cast' : conversion from 'UINT' to 'HMENU' of greater size

这些是我的问题:

>为什么编译器认为转换为更大的类型是个坏主意?
>什么是摆脱警告的最佳方法? (我不想禁用它.)
>像这样执行双重类型转换:(HMENU)(UINT_PTR)id删除警告.为什么/怎么样?
>禁用“检测64位可移植性问题”(Wp64)也会消除警告.为什么弃用Wp64?我可以买吗?

解决方法

您正在将32位UINT转换为64位指针.这是自杀 – 你试图指出一些东西,但忘记了一半的位置!你绝对必须采取UINT_PTR.当您将指针强制转换为int时,如果int与指针的大小相同,则行为才可以.否则,它是您的应用程序的运行时结束的访问违规行为.

编辑:
为什么编译器认为转换为更大的类型是个坏主意?
回覆.以上

什么是摆脱警告的最佳方法? (我不想禁用它.)
解决问题.这段代码几乎可以肯定是instacrash.

像这样做一个双重类型转换:(HMENU)(UINT_PTR)id删除警告.为什么/怎么样?
这是因为将UINT转换为UINT_PTR是完全有效的–UINT_PTR只是一个整数类型,没有数据丢失.

禁用“检测64位可移植性问题”(Wp64)也会消除警告.为什么弃用Wp64?我可以买吗?它被弃用了,因为实际上,我不太清楚为什么.我认为它有点太容易警告了.但是对于基本的“不要转换整体类型和指针”,你一定要把它留下来.

猜你在找的C&C++相关文章