Uniuni
O uniune este o varaibila care poate pastra (la momente
diferite) obiecte de diferite tipuri si dimensiuni, iar
compilatorul tine seama de cerintele de dimensiune si
aliniament. Uniunile permit sa se manipuleze diferite feluri de
date intr-o singura zona de memorie, fara sa se includa in
program nici un fel de informatii dependente de masina.
Ca de exemplu, sa consideram din nou o tabela de simboluri a
unui compilator. Sa presupunem ca constantekle pot fi "int",
"float" sau pointeri de caractere. Valoarea unei constante
particulare trebuie memorata intr-o variabila de tipul
corespunzator, dar este cel mai convenabil pentru organizarea
tabelei daca valoarea ocupa aceasi dimensiune de memorie si
acelasi loc in memorie in functie de tipul ei. Aceasta este
scopul unei uniuni -sa permita ca o singura variabila care poate
sa contina oricare din mai multe tipuri. La fel ca la cimpuri,
sintaxa se bazeaza pe structuri.
union u-tag uval;
O variabila "uval" va fi suficient de mare ca sa pastreze oricare
din cele trei tipuri, iar privitor la masina, codul generat de
compilator este indiferent de caracteristicile hard. Oricare din
aceste tipuri poate fi asignat la "uval" si apoi utilizat in
expresii, atita vreme cit uzajul este considerat, adica tipul
utilizat trebuie sa fie cel mai recent memorat. Este
responsabilitatea programatorului sa tina seama de tipul de
data curent memorat intr-o uniune; rezultatele sint dependente de
masina daca ceva este memorat ca un tip si este extras ca altul.
Sintactic, membri unei uniuni sint accesati ca
union-name.member
sau
union-pointer->member
la fel cu structurile. Daca variabila "utype" este folosita pentru
a tine seama
de tipul curent al marimii memorate in "uval", poate scrie un cod,
astfel:
if (utype == INT)
printf("%d\n", uval.ival);
else if (utype == FLOAT)
printf("%f\n", uval.fval);
else if (utype == STRING)
printf("%s\n", uval.pval);
else
printf("bad type %d in utype\n", utype);
Uniunile pot sa se gaseasca in structuri si tablouri si
viceversa. Notatia pentru a accesa un membru a unei uniuni
dintr-o structura(sau viceversa) este identica cu aceea pentru
structurile in cuiburi. De exemplu in structura definita prin
struct uval;
} symtab[NSYM];
variabila "ival" este referita astfel
symtab[i].uval.ival
iar primul caracter al sirului "pval" prin
*symtab[i].uval.pval
In fond, o uniune este o structura in care toti membri au
deplasamentul zero, structura este suficient de mare ca sa
cuprinda cel mai mare membru, iar aliniamentul este potrivit
pentru toate tipurile din uniune Ca si la structuri singurele
operatii admise cu uniunile sint de a accesa un membru si
obtinerea adresei lui;uniunile nu pot fi asignate, nu se pot
aplica functii asupra lor, Pointeri la uniuni pot fi
utilizati de o maniera identica pinterilor la structuri.
In capitolul 8 se arata cum alocatorul de memorie prin
intermediul unei uniuni de memorie prin intermediul unei uniuni
forteaza o variabila sa se alinieze la orice fel de
particularitati de memorare.