[英]reinterpret_cast from class pointer to long
我在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(完整版本)。
閱讀我的原始評論 。
問題是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);
該消息表明正在編譯的體系結構上的sizeof(long)
小於sizeof(window::Window *)
。 long
太小而無法將指針的值存儲在目標架構上。
具體來說,您似乎針對的是使用LLP64數據模型的64位Windows系統體系結構。 在LLP64中, long
是32位,而指針是64位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.