gpt4 book ai didi

c++ - 关于 "warning C4312: ' 类型转换的问题'”

转载 作者:可可西里 更新时间:2023-11-01 17:09:41 25 4
gpt4 key购买 nike

这是我的代码:

HWND WebformCreate(HWND hParent, UINT id)
{
return CreateWindowEx(0, WEBFORM_CLASS, _T("about:blank"),
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 0, 0, 100, 100, hParent,
(HMENU)id, GetModuleHandle(NULL), 0);
}

这是我收到的警告:

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

这些是我的问题:

  1. 为什么编译器认为转换为更大的类型是个坏主意?
  2. 消除警告的最佳方法是什么? (我不想禁用它。)
  3. 像这样进行双重类型转换:(HMENU)(UINT_PTR)id 摆脱警告。为什么/如何?
  4. 禁用“检测 64 位可移植性问题”(Wp64) 也会消除警告。为什么不推荐使用 Wp64?我应该戴上它吗?

最佳答案

隐藏在HMENU 名称后面的类型实际上是一个指针 类型。编译器告诉您将较小的 integer 类型封装到较大的 pointer 类型是没有意义的,因为得到的指针值将是“不完整的”,即高阶位如果指针值将用零填充。后者对指针类型意义不大。

在您的特定情况下,这是安全的,因为这个 HMENU 值实际上不应该是指向任何地方的指针。但是,编译器不知道这一点,这就是它发出警告的原因。在转换中使用更大的 integer 类型作为中间类型,警告就会消失(你自己建议的),因为在这种情况下你正在进行两次转换:较小的整数转换为较大的整数,以及然后更大的整数指向一个指针。较小的整数到较大的整数是一个算术转换,为此用零填充高阶位是非常有意义的(表示的值不会改变),因此不会有警告.

关于c++ - 关于 "warning C4312: ' 类型转换的问题'”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3569859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com