c++ - ¿Cuál es la diferencia entre static_cast y reinterpret_cast?
casting struct (1)
Posible duplicado:
¿Cuándo se deberían usar static_cast, dynamic_cast y reinterpret_cast?
Estoy usando la función c en c ++, donde una estructura pasada como un argumento de tipo vacío en c se almacena directamente en ese mismo tipo de estructura.
por ejemplo, en C.
void getdata(void *data){
Testitem *ti=data;//Testitem is of struct type.
}
hacer lo mismo en c ++ uso static_cast:
void foo::getdata(void *data){
Testitem *ti = static_cast<Testitem*>(data);
}
y cuando uso reinterpret_cast
hace el mismo trabajo, lanzando la estructura
cuando utilizo Testitem *it=(Testitem *)data;
esto hace lo mismo también. Pero cómo se ve afectada la estructura al usar los tres.
Un static_cast
es un elenco de un tipo a otro que (intuitivamente) es un elenco que podría, bajo ciertas circunstancias, tener éxito y ser significativo en ausencia de un elenco peligroso. Por ejemplo, puede static_cast
un void*
a un int*
, ya que el void*
realidad podría apuntar a un int*
, o un int
a un char
, ya que tal conversión es significativa. Sin embargo, no puede static_cast
un int*
a un double*
, ya que esta conversión solo tiene sentido si el int*
alguna manera ha sido mutilado para apuntar a un double*
.
Un reinterpret_cast
es un molde que representa una conversión insegura que podría reinterpretar los bits de un valor como los bits de otro valor. Por ejemplo, convertir un int*
en un double*
es legal con un reinterpret_cast
, aunque el resultado no está especificado. Del mismo modo, emitir un int
a un void*
es perfectamente legal con reinterpret_cast
, aunque no es seguro.
Ni static_cast
ni reinterpret_cast
pueden eliminar const
de algo. No puede convertir un const int*
a un int*
usando cualquiera de estos moldes. Para esto, const_cast
un const_cast
.
Un molde de estilo C del formulario (T)
se define como intentar hacer un static_cast
si es posible, static_cast
a un reinterpret_cast
si eso no funciona. También aplicará un const_cast
si es absolutamente necesario.
En general, siempre deberías preferir static_cast
para los lanzamientos que deberían ser seguros. Si accidentalmente intentas hacer un reparto que no está bien definido, entonces el compilador informará un error. Solo use reinterpret_cast
si lo que está haciendo realmente está cambiando la interpretación de algunos bits en la máquina, y solo use un molde de estilo C si está dispuesto a arriesgarse a hacer un reinterpret_cast
. Para su caso, debe usar static_cast
, ya que el static_cast
from the void*
está bien definido en algunas circunstancias.