Echando una constante a una unión
Pregunta
El siguiente código:
#include <stdio.h>
typedef union {
int n;
char *s;
} val_t;
int main(void) {
val_t v1,v2;
v1 = (val_t)"Hello World";
v2 = (val_t)10;
printf("%s %d\n", v1.s, v2.n);
return(1);
}
compila y se ejecuta correctamente con gcc. Si uno trata de emitir un constante para la cual no hay un campo adecuado en la unión, se produce un mensaje de error.
En cuanto a la norma (C99), sin embargo, no he sido capaz de localizar la sección donde se describe este comportamiento. Por lo tanto, mi pregunta:
¿Tiene la garantía estándar de C que puedo echar una constante para un tipo de unión, siempre que el tipo de unión tiene un campo con un tipo compatible?
o, dicho de otro modo:
es un valor p
((val_t)10)
válida de tipoval_t
?
También sería interesante saber si este comportamiento es apoyado por otros compiladores (o al menos MS Visual C ++). ¿Alguien sabe?
EDIT: La conversión a un sindicato es una extensión del CCG, así que no es una buena idea para usarlo.
Gracias a Maurits y Neil! No pensé acerca del uso de -pedantic para comprobar!
Solución
GNU C extensiones de lenguaje casting para una unión se marca como una extensión de la norma C. Por lo tanto más probable es que no lo encontrará en el C99 o cualquier otra norma C. El compilador C de IBM compatible con esta extensión también.
Otros consejos
[neilb@GONERIL NeilB]$ gcc -Wall -pedantic sw.c
sw.c: In function 'main':
sw.c:11: warning: ISO C forbids casts to union type
sw.c:12: warning: ISO C forbids casts to union type