Frage

Mit dem folgenden Code:

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

kompiliert und ausgeführt korrekt mit gcc. Wenn man versucht, eine Konstante zu werfen, für die es kein geeignetes Feld in der Vereinigung, wird eine Fehlermeldung erzeugt wird.

Mit Blick auf dem (C99) Standard, aber ich habe nicht in der Lage gewesen, um den Abschnitt zu lokalisieren, wo dieses Verhalten beschrieben. Daher meine Frage:

  

Ist die C-Standard garantiert, dass ich eine Konstante zu einer Union Typ umwandeln kann, vorausgesetzt, dass der Union-Typ ein Feld mit einem kompatibelen Typ hat?

oder, mit anderen Worten:

  

Is ((val_t)10) eine gültige rvalue vom Typ val_t?

Es wäre auch interessant zu wissen, ob das Verhalten von anderen Compilern (oder zumindest MS Visual C ++) unterstützt wird. Weiß jemand,?

EDIT:   Gießen auf eine Union ist eine GCC-Erweiterung, so ist es nicht eine gute Idee, es zu benutzen.

Dank Maurits und Neil! Ich glaube nicht, über die Verwendung von -pedantic zu überprüfen!

War es hilfreich?

Lösung

GNU C Spracherweiterungen Gießen zu einer Vereinigung markiert als eine Erweiterung der Standard-C. So sind die meisten wahrscheinlich werden Sie es nicht in der C99 oder einem anderen C-Standard finden. Die IBM-C-Compiler unterstützen diese Erweiterung als auch.

Andere Tipps

[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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top