Una uniòn consiste eb una variable que puede contener valores "normales". Las uniones son una de las alternativas para solventar la falta de comprobaciones de tipo del lenguaje C en tiempo de ejecución.
La sintaxis de la declaraciòn de una unión es semejante a la declaración de una estructura sin más que cambiar la palabra estructura por unión.
struct { /* entrada en la tabla de símbolos */
char *name;int type;
union {
int u_ival;
float u_fval;
char *_sval;
} uval;
}symtab [NSYMJ;
Las variables symtab[i].uval tienen capacidad suficiente para contener variables de cualquiera de los tipos int, float o char, siendo responsabilidad del programador tener el cuidado necesario para controlar los tipos adecuados de las variables contenidas en una unión.
La unión definida anteriormente permitiría el acceso a susjdis-tintos elementos como:
switch (symtab[i].type) {
case INT:
printf ("%d\n", symtab[i].uval.u_ival);
break;
case STRING:
printf ("%s\n", symtab[i].uval_sval);
break
case FLOAT
printf ("%s\n", symtab[i].uval_fval);
break;
}
siendo similar al programa en Pascal:
type symtab =
record
name ; array[1..10] of char;
case stype : integer of
int : ( ival : integer );
float: (fval : real );
string : (svai . array[1..20] of char );
end;
var
symtab : array [1..nsymbols] of symtab;
...
case symtab[i].stype of
int : writeln(symtab[i].ival);
float : writeln(symtab[i].fval);
string : writeln(symtab[i].sval);
end
La enorme similitud entre ambos programas puede aún aumentarse mediante el empleo del preprocesador de C, empleando #defines que hagan más manejables los nombres de variables:
#define ival uval.u_ival
#define ival uval.u_fval
#define ival uval.u_sval
Las operaciones que pueden realizarse sobre las uniones las mismas que las permitidas sobre las estructuras, acceder a uno de sus miembros y acceder a la dirección de la unión.