Вам нужно будет исправить enum
; Вы не можете определить список чисел, как это.
Тогда вы, вероятно, будете использовать union
.
struct list
{
enum { T_UNKNOWN, T_INT, T_FLOAT } type;
union
{
int v_int;
float v_float;
}; // C11 anonymous union
};
Теперь вы можете определить:
struct list l1 = { .type = T_INT, .v_int = -937 };
struct list l2 = { .type = T_FLOAT, .v_float = 1.234 };
if (l1.type == l2.type)
…the values can be compared…
else
…the values can't be compared directly…
printf("l1.type = %d; l1.v_int = %d\n", l1.type, l1.v_int);
Если у вас нет доступных C11 и анонимных союзов, вам нужно дать профсоюзу имя:
struct list
{
enum { T_UNKNOWN, T_INT, T_FLOAT } type;
union
{
int v_int;
float v_float;
} u; // C99 or C90
};
Предполагая, что C99 (поэтому вы назначили инициализаторы), вы можете использовать:
struct list l1 = { .type = T_INT, .u = { .v_int = 1 } };
и
printf("l1.type = %d; l1.u.v_int = %d\n", l1.type, l1.u.v_int);
Если у вас нет C99, то вы можете инициализировать только первый элемент объединения, член v_int
.
Традиционно для союза используется очень короткое (однобуквенное) имя; это не интересно в коде, но это было необходимо до C11.