我正在处理一些使用外部库的代码,您可以在其中通过void*
value.
不幸的是,前一个处理此代码的人决定通过将整数转换为 void 指针来将整数传递给这些回调((void*)val
).
我现在正在努力清理这个混乱,并且我正在尝试确定将整数转换为整数或从整数转换为整数的“正确”方法void*
。不幸的是,修复usevoid 指针的处理有点超出了我在这里能够进行的返工范围。
现在,我正在执行两次转换以从/到 void 指针转换:
static_cast<int>(reinterpret_cast<intptr_t>(void_p))
and
reinterpret_cast<void *>(static_cast<intptr_t>(dat_val))
由于我使用的是 64 位机器,因此直接投射((int)void_p
)导致错误:
error: cast from 'void*' to 'int' loses precision [-fpermissive]
原来的实现did与...一起工作-fpermissive
,但我试图摆脱可维护性和与错误相关的问题,所以我试图“正确”地做到这一点,例如C++ 类型转换。
直接转换为 int (static_cast<int>(void_p)
) 失败 (error: invalid static_cast from type 'void*' to type 'int'
)。我的理解reinterpret_cast
是它基本上只是导致编译器将有问题的值的地址视为转换为数据类型,而不实际发出任何机器代码,因此转换int
直接到一个void*
将是一个坏主意,因为void*
大于int
(分别为 4/8 字节)。
I think using intptr_t
是这里正确的中间值,因为它保证足够大以包含void*
,一旦我有了一个整数值,我就可以截断它,而不会导致编译器抱怨。
鉴于我必须通过空指针推送数据,这是正确的还是明智的方法?