Question

Le code suivant:

#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);
}

compile et se termine correctement avec gcc. Si l'on essaie de jeter une constante pour laquelle il n'y a pas un champ approprié dans l'union, un message d'erreur est produit.

En regardant la norme (C99), bien que, je ne l'ai pas été en mesure de localiser la section où ce comportement est décrit. Par conséquent, ma question:

  

Est-ce que la garantie standard C que je peux jeter une constante à un type d'union, à condition que le type d'union a un champ avec un type compatible?

ou, autrement dit:

  

((val_t)10) un rvalue valide de type val_t?

Il serait également intéressant de savoir si ce comportement est pris en charge par d'autres compilateurs (ou au moins MS Visual C ++). Quelqu'un sait-il?

EDIT:   L'association à un syndicat est une extension de GCC, il est donc pas une bonne idée de l'utiliser.

Merci à Maurits et Neil! Je ne pensais pas à l'aide -pedantic pour vérifier!

Était-ce utile?

La solution

GNU extensions de langage C la coulée d'une union est marquée comme une extension de la norme C. Donc, plus que probablement vous ne trouverez pas dans le C99 ou toute autre norme C. Le compilateur IBM C prend en charge cette extension ainsi.

Autres conseils

[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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top