Перечисления в структурах - PullRequest
       46

Перечисления в структурах

0 голосов
/ 01 сентября 2018

Файл My C имеет структуру и перечисление.

struct list{
    enum {1 , 2 ,3, 4};
    //defining a variable 'a'
};

Я хочу, чтобы тип данных переменной зависел от выбора enum. Например: если выбрано enum '1', 'a' должно быть 'int', '2' для float и т. Д.

1 Ответ

0 голосов
/ 01 сентября 2018

Вам нужно будет исправить 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.

...