gpt4 book ai didi

c++ - 在 C++ 中正确地将 `void*` 转换为整数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:00 24 4
gpt4 key购买 nike

我正在处理一些使用外部库的代码,您可以在其中通过 void* 值将值传递给回调。

不幸的是,之前编写此代码的人决定通过将整数转换为空指针 ((void*)val) 来将整数传递给这些回调。

我现在正在努力清理这个烂摊子,我正在尝试确定将整数转换为 void* 的“正确”方法。不幸的是,修复 void 指针的使用有点超出了我在这里能够做的返工的范围。

现在,我正在执行两次转换以从/转换为 void 指针:

static_cast<int>(reinterpret_cast<intptr_t>(void_p))

reinterpret_cast<void *>(static_cast<intptr_t>(dat_val))

由于我在 64 位机器上,直接转换 ((int)void_p) 会导致错误:

error: cast from 'void*' to 'int' loses precision [-fpermissive]

原始实现确实-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 字节)。

认为在这里使用 intptr_t 是正确的中间值,因为它保证足够大以包含 void* 的整数值,一旦我有一个整数值,我就可以截断它而不会导致编译器提示。

考虑到我不得不通过 void 指针推送数据,这是正确的,甚至是明智的方法吗?

最佳答案

I think using intptr_t is the correct intermediate here, since it's guaranteed to be large enough to contain the integral value of the void*, and once I have an integer value I can then truncate it without causing the compiler to complain.

是的,正如您提到的那样,这是正确的中间类型。到现在为止,如果您的实现没有提供它,那么您可能遇到的问题不仅仅是缺少 typedef。

Is this the correct, or even a sane approach given I'm stuck having to push data through a void pointer?

是的,考虑到限制,它非常理智。
您可能会考虑检查值是否适合,而不是在 Debug模式下从 void* 中解压缩它时简单地截断它,或者甚至使用 intptr 代替该整数的所有进一步处理int 以避免截断。

您还可以考虑通过该参数将指针推送到实际的 int 而不是 int 本身。请注意,这虽然效率较低,但会让您面临终生问题。

关于c++ - 在 C++ 中正确地将 `void*` 转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30768714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com