转换为 void* 并返回 Original_Data_Type*

Izz*_*zza 3 c++ casting void-pointers

我已经多次看到并使用了 C++,特别是在各种线程实现中。我想知道这样做是否有任何陷阱/问题?当我们强制转换为 void* 并再次返回时,有什么方法可能会遇到错误或未定义的条件吗?如果有这些问题,我们应该如何解决?

谢谢你。

Dre*_*ann 5

我还没有看到void*在 C++ 中进行过多的转换。这是 C 中的一种做法,而在 C++ 中则积极避免。

强制转换为void*删除所有类型安全。

如果您使用reinterpret_caststatic_cast将指针类型转换void*为相同的指针类型并返回相同的指针类型,则标准实际上可以保证结果将是明确定义的

危险在于您可能会将 avoid*转换为错误的类型,因为您不再确定正确的类型是什么。


Alo*_*ave 3

我想知道这样做是否存在任何陷阱/问题?

在将背面转换为特定类型时,您需要绝对确定void*,如果不这样做,您最终会出现未定义的行为和潜在的灾难。一旦使用,void *您就会失去类型安全性。很难跟踪 avoid *实际指向的类型,无法保证或确定它确实指向您要将其类型转换回的类型。

当我们转换为 void* 并再次转换回来时,有没有什么方法可以遇到错误或未定义的情况?

是的,就是文中提到的场景#1

如果出现此类问题我们该如何解决?

void *完全避免在C++中使用,而是使用模板和继承。
在 C 语言中,在某些情况下你可能绝对需要它,但尽量将其使用保持在最低限度。
底线是,
C/C++ 允许你搬起石头砸自己的脚,这取决于你是否这样做。