Declarações union
Uma "declaração de união" especifica um conjunto de valores de variáveis e, opcionalmente, uma tag que nomeia a união. Os valores de variáveis são chamados de “membros” da união e podem ter tipos diferentes. Uniões são semelhantes a "registros variantes" em outras linguagens.
Sintaxe
struct-or-union-specifier
:
struct-or-union
identifier
opt {
struct-declaration-list
}
struct-or-union
identifier
struct-or-union
:
struct
union
struct-declaration-list
:
struct-declaration
struct-declaration-list
struct-declaration
O conteúdo da união é definido para ser
struct-declaration
:
specifier-qualifier-list
struct-declarator-list
;
specifier-qualifier-list
:
type-specifier
specifier-qualifier-list
opt
type-qualifier
specifier-qualifier-list
opt
struct-declarator-list
:
struct-declarator
struct-declarator-list
,
struct-declarator
Uma variável com tipo union
armazena um dos valores definidos por esse tipo. As mesmas regras controlam declarações da estrutura e de união. Uniões também podem ter campos de bits.
Membros de uniões não podem ter um tipo incompleto, o tipo void
ou o tipo função. Portanto, os membros não podem ser uma instância da união, mas podem ser ponteiros para o tipo união que está sendo declarado.
Uma declaração de tipo de união é somente um modelo. A memória não será reservada até que a variável seja declarada.
Observação
Se uma união de dois tipos é declarada e um valor é armazenado, mas a união é acessada com o outro tipo, os resultados são não confiáveis. Por exemplo, uma união de float
e int
é declarada. Um valor float
é armazenado, mas o programa acessa posteriormente o valor como um int
. Nessa situação, o valor dependeria do armazenamento interno de valores float
. O valor inteiro não seria confiável.
Exemplos
Veja a seguir alguns exemplos de uniões:
union sign /* A definition and a declaration */
{
int svar;
unsigned uvar;
} number;
Este exemplo define uma variável de união com tipo sign
e declara uma variável nomeada number
que tem dois membros: svar
, um inteiro assinado, e uvar
, um inteiro sem sinal. Esta declaração permite que o valor atual de number
seja armazenado como um valor assinado ou não assinado. A marca associada a esse tipo de união é sign
.
union /* Defines a two-dimensional */
{ /* array named screen */
struct
{
unsigned int icon : 8;
unsigned color : 4;
} window1;
int screenval;
} screen[25][80];
A matriz screen
contém 2.000 elementos. Cada elemento da matriz é uma união individual com dois membros: window1
e screenval
. O membro window1
é uma estrutura com dois membros de campos de bits, icon
e color
. O membro screenval
é um int
. Em um determinado momento, cada elemento da união mantém int
representada por screenval
ou a estrutura representada por window1
.
Seção específica da Microsoft
As uniões aninhadas podem ser declaradas anonimamente quando são membros de outra estrutura ou união. Veja um exemplo de união sem nome:
struct str
{
int a, b;
union /* Unnamed union */
{
char c[4];
long l;
float f;
};
char c_array[10];
} my_str;
.
.
.
my_str.l == 0L; /* A reference to a field in the my_str union */
Uniões frequentemente são aninhadas em uma estrutura que inclui um campo que fornece o tipo de dados contido na união de qualquer horário específico. Veja um exemplo de declaração para essa união:
struct x
{
int type_tag;
union
{
int x;
float y;
}
}
Consulte Membros de estruturas e uniões para obter informações sobre uniões de referência.
Fim da seção específica da Microsoft