【问题标题】:C++ compilation error: "cast from 'WCHAR*' to 'WORD' loses precision"C++ 编译错误:“从 'WCHAR*' 转换为 'WORD' 失去精度”
【发布时间】:2011-07-26 19:48:49
【问题描述】:

MyGUI 库。

它的来源中有一行:

mHandle = (size_t)::LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));

mHandlesize_t

LoadCursor 返回HCURSOR

错误:

D:\Dev\MyGUI_3.2.0_RC1\Common\Input\Win32\ResourceW32Pointer.cpp:48: error: cast
from 'WCHAR*' to 'WORD' loses precision

这里是完整的来源:
www.pastebin.com/gzqLBFh9

MinGW 编译器。

cast from 'CHAR*' to 'WORD' loses precision 出现错误,selbie 建议在此处添加宏:Create window with WNDCLASSEX? [Cpp]。多亏了他 - 它消失了。

【问题讨论】:

  • 为什么不将mHandle 声明为HCURSOR 类型?为什么需要投?如果你必须强制转换(我认为你不需要),你为什么要使用 C 强制转换?您的代码是 C++。
  • 如果是我的代码,这将是一个很好的解决方案:) 但是通过更改其他库中的某些内容,会出现来自代码不同部分的许多错误:)。但如果没有其他方法,我会这样做。
  • 如果不能改代码,那怎么修复bug呢?!
  • ResourceW32Pointer.h 是您的代码还是第三方代码?我们能看到吗?
  • size_tmHandle 来说是错误的。没有两种方法。 @Mark 是正确的。

标签: c++ winapi mingw


【解决方案1】:

问题实际上出在MAKEINTRESOURCE(IDC_ARROW),与mHandle 的类型无关。 [旁白:我同意mHandle 不应该是size_t,但我认为这不是您当前的问题。]

由于IDC_ARROW被定义为MAKEINTRESOURCE(32512),代码实际上应该是这样的

LoadCursor(NULL, IDC_ARROW)

而不是

LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW))

后一个代码失败,因为 IDC_ARROW 是 LPTSTRMAKEINTRESOURCE() 需要 WORD。这解释了您看到的错误消息。事实上IDC_ARROW已经是一个资源类型,不需要进一步处理。

同样,对LoadCursor() 的所有其他调用都出错了。

【讨论】:

  • 就是这样。现在这部分库编译得很好。但是还有很多错误。 :) 无论如何,这很有趣。谢谢。
【解决方案2】:

mHandle 不应该是WORD - 这是完全错误的。 WORD 是 16 位,size_t 通常是 32 位或 64 位,具体取决于编译器选项,与具有相同选项的指针大小相同。由于 32 和 64 都大于 16,因此编译器在抱怨,这是正确的。

您对size_t 的定义似乎不正确,您应该修正它。那么你应该重新定义mHandle,使它真正成为一个句柄而不是size_t

【讨论】:

  • @MInner 是的,这是真的,这就是为什么我说某处对 size_t 的定义不正确。实际上,更重要的解决方法是为mHandle 选择正确的类型。
  • 抱歉,我之前的评论有点删减。所以,就 Code::Blocks 在这个项目中找到任何 size_t 的声明,唯一的一个在 stddef.h 中,所以它一定是没问题的。关于重新定义 mHandle - 它在可能不同的地方用作 size_t (代码不是我的所以..),因此可能很难重写所有库。一定是其他地方出了问题?
  • @MInner,您的编译器选项是否可能设置为进行 16 位构建?在这个时代似乎不太可能,但这是我能想到的唯一其他事情。
  • @Mark 我认为这完全是一条红鲱鱼。查看我的回答并考虑MAKEINTRESOURCE() 收到WORD
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 2011-06-02
  • 2018-11-18
  • 2015-12-07
  • 2022-12-31
  • 2019-10-23
  • 1970-01-01
相关资源
最近更新 更多