从类指针reinterpret_cast到long

时间:2012-09-08 19:42:34

标签: c++ windows

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

2 个答案:

答案 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位。