8

所以我在我的 C++ 应用程序中使用这个 C 库,其中一个函数返回一个 void*。现在我对纯 C 不是最敏锐的,但听说 void* 可以转换为几乎任何其他 * 类型。我也知道我希望这个函数的末尾有一个浮点数。

所以我将 void* 转换为 float* 并取消引用 float*,崩溃。该死!我调试代码并在 gdb 中让它评估(float)voidPtr和降低,看看这个值是我期望和需要的!

但是等等,在编译期间不可能相同。如果我写float number = (float)voidPtr;它不会编译,这是可以理解的。

所以现在的问题是,我如何让我的漂浮物脱离这个该死的虚空*?

编辑:多亏了 H2CO3,这个问题得到了解决,但我看到很多答案和评论出现并且不相信我可以在 gdb 中做 (float)voidPtr。这是屏幕截图。

在此处输入图像描述

4

2 回答 2

16

尝试使用指针:

void *theValueAsVoidPtr = // whatever

float flt = *(float *)&theValueAsVoidPtr;
于 2013-03-09T17:22:57.533 回答
9

如果我理解正确,您的库将在声明类型为void *. 再次取出它的最安全方法是使用union

#include <assert.h>
static_assert(sizeof(float) == sizeof(void *));

union extract_float {
    float vf;
    void * vp;
};

float foo(...)
{
    union extract_float ef;
    ef.vp = problematic_library_call(...);
    return ef.vf;
}

与已接受答案中的方法不同,这不会触发未定义的行为。

于 2015-03-10T21:06:57.317 回答