64-bit - 使用 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->mht
或soap->pht
)的索引 - 但是我还不太清楚 - 有人可以给我一个提示吗?谢谢你。
- 开发环境:VS2017
- 目标:x64
- gsoap 版本:大约 2005 年
解决方案
PtrToUlong
正确用于截断指针,因为 Win64 使用指针的规则实际上建议这样做https://docs.microsoft.com/en-us/windows/desktop/winprog64/rules-for-using-pointers
- 使用 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
此定义及其用于索引表的用途不会导致问题。
推荐阅读
- c# - 为什么 Respawn 会擦除我的整个数据库?
- javascript - Nodejs execSync 工作但不工作,更改为系统不生效
- android - Android 依赖问题 - ApachePOI & fasterxml
- c++ - 为什么我可以使用类型别名声明 const 引用?
- vb.net - 如何删除最近添加的控件?
- c++ - 使用类模板参数推导制作静态接口
- nginx - nginx lua body_filter_by_lua_block 需要在 content_by_lua 的上下文中执行 sleep API disabled*
- guice - 如何绑定动态@Named 绑定
- abap - 形参个数大于实参个数
- javascript - 在角度项目中的数组上设置间隔