2017-10-05 22 views
0

我正在維護一些代碼,並且在升級到較新的編譯器Visual Studio 2015後,我得到一個編譯器警告,其中FT_HANDLE被轉換爲LPLONG。如何安全地從FT_HANDLE轉換爲LPLONG-64位編譯

執行此轉換並刪除警告的安全方法是什麼?

#include <Windows.h> 
#include <iostream> 

typedef PVOID FT_HANDLE; 

void convert(FT_HANDLE ftHandle, LPLONG pPortNumber) { 

    *pPortNumber = reinterpret_cast<long>(ftHandle) & 0xFF; // problem here 
} 


int main() { 

    FT_HANDLE handle = malloc(10); // simulate a real handle 
    LONG portNumber(0); 
    convert(handle, &portNumber); 
    std::cout << "result=" << &portNumber << '\n'; 
    free(handle); 
} 

編譯器警告:

warning C4311: 'reinterpret_cast': pointer truncation from 'FT_HANDLE' to 'long' 
warning C4302: 'reinterpret_cast': truncation from 'FT_HANDLE' to 'long' 
+0

而這個警告是......究竟是什麼? –

+0

地址的低8位如何對應任何東西? – 1201ProgramAlarm

+0

What @ 1201ProgramAlarm的意思是說'FT_HANDLE'是_pointer_。據推測,你想要在該地址施放該值,而不是地址本身。嘗試'reinterpret_cast (* ftHandle)'。 –

回答

0

的安全的方法是做到這一點。代碼看起來無法解決。

問題的第一部分是long是32位,而Win64指針不是。

第二部分是按值傳遞LPLONG portnumber。這是一個輸入參數,而不是輸出參數。

+0

這是非常不好的同意。但LPLONG是一個很長的*,所以解引用和分配一個值至少是一個可行的事情。因此,作爲指針傳遞,調用者將得到更新的ptr值。 –

+0

@AngusComber:你似乎在理解指針方面有問題。給定'LPLONG pPortNumber',你可以給'pPortNumber'賦值或者給'* pPortNumber'賦值。爲'pPortNumber'賦值並不會改變'&portNumber'或'portNumber'的值。調用者不會**以這種方式獲得改變的指針。 – MSalters

相關問題