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 tipo val_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!

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top