简体   繁体   中英

void* is literally float, how to cast?

So I'm using this C library in my C++ app, and one of the functions returns a void*. Now I'm not the sharpest with pure C, but have heard that a void* can be cast to pretty much any other *-type. I also know that I expect a float at the end somewhere from this function.

So I cast the void* to a float* and dereference the float*, crash. darn!. I debug the code and in gdb let it evaluate (float)voidPtr and low and behold the value is what I expect and need!

But wait, it's impossible to the same during compile time. If I write float number = (float)voidPtr; it doesn't compile, which is understandable.

So now the question, how do I get my float out of this fricking void*?

EDIT: Thanks to H2CO3 this was solved, but I see lots of answers and comments appearing and dissappering not believing that I could do (float)voidPtr in gdb. here is the screenshot.

在此处输入图片说明

Try using pointers:

void *theValueAsVoidPtr = // whatever

float flt = *(float *)&theValueAsVoidPtr;

If I understand correctly, your library is returning a float value in a variable whose declared type is void * . The safest way to get it back out again is with a 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;
}

Unlike the approach in the accepted answer, this does not trigger undefined behavior.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM