可能重复:
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;
这也是同样的事情。 但是如何通过使用它们中的三个来影响结构。
答案 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_cast
和reinterpret_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*
中的向下转换在某些情况下是明确定义的。