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.