Un clásico es para representar un valor de tipo "desconocido", como en el núcleo de una máquina virtual simplista:
typedef enum { INTEGER, STRING, REAL, POINTER } Type;
typedef struct
{
Type type;
union {
int integer;
char *string;
float real;
void *pointer;
} x;
} Value;
El uso de este se puede escribir código que se encarga de "valores" sin conocer su tipo exacto , por ejemplo, implementar una pila, etc.
Dado que está en (anterior, anterior a C11) C, la unión interna debe tener un nombre de campo en el exterior struct
. En C++ puede dejar que el union
sea anónimo. Escoger este nombre puede ser difícil. Tiendo a ir con algo de una sola letra, ya que casi nunca se hace referencia de forma aislada y, por lo tanto, siempre está claro, desde el contexto, lo que está sucediendo.
Código para establecer un valor a un entero podría tener este aspecto:
Value value_new_integer(int v)
{
Value v;
v.type = INTEGER;
v.x.integer = v;
return v;
}
Aquí, he utilizado el hecho de que struct
s pueden ser devueltos directamente, y se tratan casi como valores de un tipo primitivo (puede asignar struct
s).
supongo ¡este podría ser útil! – claf
Tenga en cuenta que C11 proporciona uniones anónimas, por lo que el párrafo 'ya que es C' se aplica a C90 y C99, pero no a C11.Igualmente claro, ya que esta respuesta se escribió en 2009, era bastante razonable no predecir lo que C11 proporcionaría. –
@unwind por curiosidad, estoy haciendo esta pregunta. ¿La función anterior no proporciona _redeclaration error_? –