Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+从Void*转换为TYPE*+;样式转换:静态转换或重新解释转换_C++_Casting_Static Cast_Reinterpret Cast - Fatal编程技术网

C++ 使用C+从Void*转换为TYPE*+;样式转换:静态转换或重新解释转换

C++ 使用C+从Void*转换为TYPE*+;样式转换:静态转换或重新解释转换,c++,casting,static-cast,reinterpret-cast,C++,Casting,Static Cast,Reinterpret Cast,因此,如果您从Void*转换为Type*或从Type*转换为Void*,您应该使用: void func(void *p) { Params *params = static_cast<Params*>(p); } void func(void*p) { Params*Params=静态(p); } 或 void func(void*p) { 参数*参数=重新解释铸造(p); } 对我来说,static_cast似乎更为正确,但我看到它们都用于相同的目的。此外,转换的方

因此,如果您从Void*转换为Type*或从Type*转换为Void*,您应该使用:

void func(void *p)
{
    Params *params = static_cast<Params*>(p);
}
void func(void*p)
{
Params*Params=静态(p);
}

void func(void*p)
{
参数*参数=重新解释铸造(p);
}
对我来说,static_cast似乎更为正确,但我看到它们都用于相同的目的。此外,转换的方向也很重要。i、 e.我是否仍应使用静态_cast:

_beginthread(func,0,static_cast<void*>(params)
\u beginthread(func,0,静态转换(参数)

我已经阅读了关于C++风格的其他问题,但是我仍然不确定这个场景的正确方式(我认为它是静态的)。

您应该使用静态强制转换,以便正确操作指针指向正确的位置。但是,只有在首先使用静态强制转换将指针强制转换为void*时,您才应该执行此操作。否则,您应该将\u强制转换重新解释为与原始指针完全相同的类型(无基或类似).

您应该始终避免
重新解释投射
,在这种情况下,
静态投射
将完成此工作。当转换为
无效*
指针时,不需要任何类型的投射。

为此在两侧使用
静态投射
,并在没有其他投射操作时保存
重新解释投射
执行。以下SO主题提供了更多上下文和详细信息:


那么为什么要重新解释强制转换呢?是否有任何情况下应该使用重新解释强制转换。其他3个强制转换操作符是否可以覆盖所有强制转换操作?如果void*的另一侧将强制转换为基类,则在分配给void之前,您还需要强制转换为该基类。@Noah对此有一些参考吗?您的意思是除了sta之外标准?允许的静态类型转换及其结果在5.2.9(expr.static.cast)中描述。关于void*的段落是4和10。@MartinYork reinterpret_cast是用于在相同大小的不相关类型之间进行转换的内容(例如intptr_t void*,这将不会与静态类型转换或类似内容一起使用)。
_beginthread(func,0,static_cast<void*>(params)