Συχνά, για να ξέρουμε το είδος της τιμής που αποθηκεύει μια ένωση
ορίζουμε μια δομή που περιέχει:
- μια απαρίθμηση (ορισμό και πεδίο) με τους τύπους των τιμών και
- μια ένωση (ορισμό και πεδίο) με τις τιμές.
Παράδειγμα:
struct s_value {
enum {
T_INT,
T_DOUBLE,
T_CHAR
} type; /* Value type */
union {
int i;
double d;
char c;
} v; /* Actual value */
};
/*
* Read an integer and return a proper struct s_value
*/
struct s_value
read_int(void)
{
struct s_value a;
a.type = T_INT;
scanf("%d", &a.v.i);
return (a);
}
/*
* Read a double and return a proper struct s_value
*/
struct s_value
read_double(void)
{
struct s_value a;
a.type = T_DOUBLE;
scanf("%lg", &a.v.d);
return (a);
}
/*
* Read a character and return a proper struct s_value
*/
struct s_value
read_char(void)
{
struct s_value a;
a.type = T_CHAR;
a.v.c = getchar();
return (a);
}
/*
* Print a struct s_value
*/
void
print_value(struct s_value a)
{
switch (a.type) {
case T_INT:
printf("%d", a.v.i);
break;
case T_DOUBLE:
printf("%lg", a.v.d);
break;
case T_CHAR:
putchar(a.v.c);
break;
default: /* Defensive programming */
printf("Bad value type %d\n", a.type);
break;
}
}