[英]void* is literally float, how to cast?
因此,我在C ++應用程序中使用了這個C庫,其中一個函數返回void *。 現在我對純C並不是最精明的,但是聽說可以將void *轉換為幾乎所有其他*類型。 我也知道我希望此函數的結尾處有一個浮點數。
因此,我將void *強制轉換為float *,然后取消引用float *,導致崩潰。 該死! 我調試了代碼,並在gdb中讓它評估(float)voidPtr
和low,並認為該值是我期望和需要的!
但是,等等,在編譯期間不可能做到相同。 如果我寫float number = (float)voidPtr;
它不會編譯,這是可以理解的。
因此,現在的問題是,如何使我的漂浮物擺脫這個充滿欺騙性的空白*?
編輯:由於使用了H2CO3,因此得以解決,但是我看到很多答案和評論出現,並且在不相信我可以在gdb中做到(float)voidPtr的情況下消失。 這是屏幕截圖。
嘗試使用指針:
void *theValueAsVoidPtr = // whatever
float flt = *(float *)&theValueAsVoidPtr;
如果我理解正確,則您的庫將在聲明的類型為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;
}
與接受的答案中的方法不同,這不會觸發未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.