这是我的代码:
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?我可以买吗?它被弃用了,因为实际上,我不太清楚为什么.我认为它有点太容易警告了.但是对于基本的“不要转换整体类型和指针”,你一定要把它留下来.