我有一个返回空数据的函数,但是我需要将其作为结构体接收。 例如:一个名为widget_data的结构体,一个名为GetObjectData()的函数返回空数据。
widget_data *wd=GetObjectData();
GetObjectData()
返回sd->data
。
其中sd
是一个结构体,数据类型为void
。
当我编译它时,会出现错误信息。
invalid conversion from void* to widget_data*
我有一个返回空数据的函数,但是我需要将其作为结构体接收。 例如:一个名为widget_data的结构体,一个名为GetObjectData()的函数返回空数据。
widget_data *wd=GetObjectData();
GetObjectData()
返回sd->data
。
其中sd
是一个结构体,数据类型为void
。
当我编译它时,会出现错误信息。
invalid conversion from void* to widget_data*
static_cast
可以将void*
转换为指向特定类型的指针:
widget_data* wd = static_cast<widget_data*>( yourVoidPointer );
widget_data *wd=(widget_data *)GetObjectData();
或者
widget_data *wd=reinterpret_cast<widget_data *>(GetObjectData());
reinterpret_cast
是更好的选择。从编码角度来看,将void*
转换可能看起来很不干净,而reinterpret_cast
比static_cast
更不干净。 - iammilind这是合法的C语言,但不是合法的C++语言。你需要在C++中进行显式转换,例如
widget_data *wd = static_cast<widget_data *>(GetObjectData());
让我们先澄清一些事情。 void
表示什么也没有,因此您不能拥有 void 类型的数据。因此,如果函数返回 void
,则无法返回任何数据。现在,void *
是一个空指针。您可以将其视为指向某个地方的内存地址。它可以指向任何类型的数据,甚至可能是不存在的。如果您非常确定您的函数返回指向 widget_data
对象的指针,则可以进行 reinterpret_cast。例如:
widget_data *wd = reinterpret_cast<widget_data *> (GetObjectData ());
如果你不太确定,你必须检查返回的数据类型。如果启用了RTTI(通常默认启用),并且基类至少有一个虚方法,则可能会实现此操作。然后可以使用dynamic_cast。如果无法实现此操作,则必须想出一些自定义的方法来检查返回类型。
reinterpret_cast
和static_cast
都会做同样的事情,我更喜欢使用reinterpret_cast
,因为它能够让阅读代码的人更清楚地了解到存在一个强烈的假设和不太强的类型检查,这表明可能存在非常肮脏的黑科技。但是,从技术上讲,两者都能完成工作。 - user405725