我用Win64在Win64上编写了一个C ++应用程序:
Window* wnd = 0;
long l = reinterpret_cast<long> ( wnd );
编译器在最后一行显示以下错误:
error: cast from 'window::Window*' to 'long int' loses precision [-fpermissive]
我使用此值将其置于SetWindowLong(WindowsAPI)函数中。
我无法理解这个错误。我正在使用MinGW-w64(ruben build)。
答案 0 :(得分:3)
阅读我的original comment。
问题是sizeof(window::Window *)
大于sizeof(long)
,这意味着您无法在l
中有效地存储指针的值。这解释了错误。
现在,真正想要的东西实际上是使用SetWindowLongPtr
代替。
注意要编写与32位和64位版本的Windows兼容的代码,请使用
SetWindowLongPtr
。在为32位Windows进行编译时,SetWindowLongPtr
被定义为对SetWindowLong
函数的调用。
window::Window *wnd = ...;
HWND handle = ...;
int index = ...; /* e.g. GWLP_USERDATA */
LONG_PTR val = reinterpret_cast<LONG_PTR>(wnd);
SetWindowLongPtr(handle, index, val);
答案 1 :(得分:1)
该消息表明您正在编译的体系结构上的sizeof(long)
小于sizeof(window::Window *)
。 long
太小,无法将指针的值存储在您定位的架构上。
具体来说,您似乎是针对使用LLP64数据模型的64位Windows系统架构。在LLP64中,long
是32位,指针是64位。