Domanda

Il seguente codice:

#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 ed esegue correttamente con gcc. Se si cerca di lanciare una costante per le quali non c'è un campo adeguato nel sindacato, si produce un messaggio di errore.

Guardando lo standard (C99), però, ho non sono stati in grado di individuare la sezione in cui è descritto questo comportamento. Quindi, la mia domanda:

  

fa la normale garanzia C che posso lanciare una costante a un tipo di unione, a condizione che il tipo di unione è un campo con un tipo compatibile?

o, in altre parole:

  

è ((val_t)10) un rvalue valida di tipo val_t?

Sarebbe anche interessante sapere se questo comportamento è supportato da altri compilatori (o almeno MS Visual C ++). Qualcuno sa?

EDIT:   Casting a un sindacato è un'estensione GCC, quindi non è una buona idea usarlo.

Grazie a Maurits e Neil! Non ho pensato di usare -pedantic per controllare!

È stato utile?

Soluzione

GNU C lingua colata a un sindacato è contrassegnato come un'estensione dello standard C. Così la maggior parte probabilmente non lo troverete nella C99 o di qualsiasi altra norma C. Il compilatore IBM C supporta questa estensione pure.

Altri suggerimenti

[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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top