Lançando uma constante para uma união
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 tipoval_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!
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