Pergunta

O seguinte 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 e executa corretamente com o gcc.Se alguém tentar converter uma constante para a qual não existe um campo adequado na união, será produzida uma mensagem de erro.

Porém, olhando para o padrão (C99), não consegui localizar a seção onde esse comportamento é descrito.Daí a minha pergunta:

O padrão C garante que posso converter uma constante em um tipo de união, desde que o tipo de união possua um campo com um tipo compatível?

ou, em outras palavras:

É ((val_t)10) um rvalue válido do tipo val_t?

Também seria interessante saber se este comportamento é suportado por outros compiladores (ou pelo menos MS Visual C++).Alguém sabe?

EDITAR:A conversão para um sindicato é uma extensão do GCC, portanto não é uma boa ideia usá-la.

Obrigado a Maurits e Neil!Não pensei em usar -pedantic para verificar!

Foi útil?

Solução

Dentro Extensões de idiomas GNU C O elenco para uma união é marcado como uma extensão do padrão C. Então, provavelmente você não o encontrará no C99 ou em qualquer outro padrão C. O compilador IBM C também suporta esta extensão.

Outras dicas

[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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top