static_cast和reinterpret_cast有什么区别?

时间:2011-07-28 07:53:23

标签: c++ c casting struct

  

可能重复:
  When should static_cast, dynamic_cast and reinterpret_cast be used?

我在c ++中使用c函数,其中在c中作为void类型参数传递的结构直接存储相同的结构类型。

例如在C。

void getdata(void *data){
    Testitem *ti=data;//Testitem is of struct type.
}

在c ++中使用static_cast:

void foo::getdata(void *data){
    Testitem *ti = static_cast<Testitem*>(data);
}

当我使用reinterpret_cast时,它执行相同的工作,转换结构

当我使用Testitem *it=(Testitem *)data;

这也是同样的事情。 但是如何通过使用它们中的三个来影响结构。

1 个答案:

答案 0 :(得分:106)

static_cast是从一种类型到另一种类型的演员,(直觉上)是一种演员,在某些情况下可以成功并且在没有危险演员的情况下有意义。例如,您可以static_cast void*int*,因为void*实际上可能指向int*int char,因为这种转换很有意义。但是,您不能static_cast int*double*,因为如果int*以某种方式被修改为指向double*,则此转换才有意义。

reinterpret_cast是表示不安全转换的转换,可能会将一个值的位重新解释为另一个值的位。例如,将int*转换为double*reinterpret_cast合法,但结果未指定。同样地,将int投放到void*reinterpret_cast完全合法,但它不安全。

static_castreinterpret_cast都无法删除某些内容const。您无法使用这些演员阵容将const int*投射到int*。为此,您将使用const_cast

(T)形式的C风格演员定义为尽可能尝试static_cast,如果不起作用,则返回reinterpret_cast。如果绝对必要,它也会应用const_cast

一般情况下,对于应该安全的演员表,您应该总是更喜欢static_cast。如果您不小心尝试进行定义不明确的强制转换,则编译器将报告错误。只有使用reinterpret_cast,如果您正在做的事情正在改变机器中某些位的解释,并且如果您愿意冒险执行reinterpret_cast,则仅使用C风格的转换。对于您的情况,您应该使用static_cast,因为void*中的向下转换在某些情况下是明确定义的。