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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...