A diferencia de C++, C no tiene noción de const_cast
. Es decir, no hay manera válida para convertir un puntero const-calificado para un puntero sin salvedades:¿Es const-casting a través de un comportamiento indefinido de unión?
void const * p;
void * q = p; // not good
En primer lugar: ¿Es este elenco de hecho un comportamiento indefinido?
En cualquier caso, GCC advierte sobre esto. Para hacer un código "limpio" que requiera un molde constante (es decir, donde puedo garantizar que no mutaré el contenido, pero todo lo que tengo es un puntero mutable), he visto el siguiente truco de "conversión":
typedef union constcaster_
{
void * mp;
void const * cp;
} constcaster;
Uso: u.cp = p; q = u.mp;
.
¿Cuáles son las reglas del lenguaje C para eliminar la constness a través de dicha unión? Mi conocimiento de C es muy desigual, pero he escuchado que C es mucho más indulgente con el acceso a la unión que C++, así que aunque tengo un mal presentimiento sobre esta construcción, me gustaría un argumento del estándar (C99 supongo, aunque si esto ha cambiado en C11 será bueno saberlo).
¿Quieres decir '* q = (*) p 'en el primer bloque de código vacío vacío? – kennytm
@KennyTM: Sí, ¿necesito el lanzamiento explícito, y/o hace la diferencia? –
Sin el lanzamiento implícito, gcc advierte sobre el descarte de los calificadores. Pero gcc aún informa un error ("el elemento inicializador no es constante") incluso con el molde. –