c++ c casting struct

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.