从类指针reinterpret_cast长

我用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位。