首页 > 解决方案 > 使用 Visual Studio 为 x64 编译 gsoap:C4302 转换:从 void* 到 unsigned int 的截断

问题描述

我正在尝试使用 VS 2017 为 x64 编译 gsoap。有一个编译器警告,因为void*(64bit address) 被转换为unsigned int(32bit integer)。它发生在h = soap_hash_ptr(p)p 是void*且 h 是 的地方unsigned int

这看起来很关键 - 因此我查看stdsoap2.cpp了当前的 gsoap 版本 - 但是soap_hash_ptr似乎通过它做同样的事情PtrToUlong- 我想保留很棒的 gsoap - 但我仍然可以依赖 - 可能是的,因为返回值soap_hash_ptr是用作数组或向量(soap->mhtsoap->pht)的索引 - 但是我还不太清楚 - 有人可以给我一个提示吗?谢谢你。

标签: 64-bitgsoap

解决方案


PtrToUlong正确用于截断指针,因为 Win64 使用指针的规则实际上建议这样做https://docs.microsoft.com/en-us/windows/desktop/winprog64/rules-for-using-pointers

  1. 使用 PtrToLong 或 PtrToUlong 函数截断指针。

如果必须截断指向 32 位值的指针,请使用 PtrToLong 或 PtrToUlong 函数(在 Basetsd.h 中定义)。这些函数在调用期间禁用指针截断警告。

您引用的soap_hash_ptr宏用于计算哈希表的索引:

#if defined(WIN32) && !defined(UNDER_CE)
#define soap_hash_ptr(p)        ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))
#else
#define soap_hash_ptr(p)        ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1)))
#endif

此定义及其用于索引表的用途不会导致问题。


推荐阅读