我正在维护一些代码,在升级到更新的编译器Visual Studio 2015之后,我收到编译器警告,其中的代码将FT_HANDLE转换为LPLONG。
执行此转换以及删除警告的安全方法是什么?
#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)
安全的方法是不这样做。该代码似乎无法实现。
问题的第一部分是long
是32位,而Win64指针则不是。
第二部分是LPLONG portnumber
按值传递。它是输入参数,而不是输出参数。