如何安全地从FT_HANDLE转换为LPLONG-64位编译

时间:2017-10-05 19:37:36

标签: c++ reinterpret-cast

我正在维护一些代码,在升级到更新的编译器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'

1 个答案:

答案 0 :(得分:0)

安全的方法是这样做。该代码似乎无法实现。

问题的第一部分是long是32位,而Win64指针则不是。

第二部分是LPLONG portnumber按值传递。它是输入参数,而不是输出参数。