我用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)。
阅读我原来的评论 。
问题是sizeof(window::Window *)
大于sizeof(long)
,这意味着你不能有效地将指针的值存储在l
。 这解释了错误。
现在,你真正想要的是实际上使用SetWindowLongPtr
来代替。
注意要编写与32位和64位版本的Windows兼容的代码,请使用
SetWindowLongPtr
。 在编译32位Windows时,SetWindowLongPtr
被定义为对SetWindowLong
函数的调用。
window::Window *wnd = ...; HWND handle = ...; int index = ...; /* eg GWLP_USERDATA */ LONG_PTR val = reinterpret_cast<LONG_PTR>(wnd); SetWindowLongPtr(handle, index, val);
该消息表明,您正在编译的体系结构的sizeof(long)
小于sizeof(window::Window *)
的sizeof(long)
sizeof(window::Window *)
。 long
太小而无法在指定的架构上存储指针的值。
具体而言,您似乎将目标锁定为使用LLP64数据模型的64位Windows系统体系结构。 在LLP64中, long
是32位,指针是64位。