перечисление в структуре; новичок в с - PullRequest
3 голосов
/ 05 мая 2011

Меня интересует синтаксис использования enum в struct ( в C)

Я видел различные примеры, где struct+ union / enum комбинация использовалась для создания сложного типа, например:

struct MyStruct{
    enum{
        TYPE_1,
        TYPE_2,
        TYPE_3,
    } type;
    union{
        int value_1;
        int value_2;
        int value_3;
    } value;
};

// ...

struct MyStruct test_struct;

В любом случае, из этого примера, как мне сохранить / протестировать текущий «тип» согласно enum поле?

Если у меня есть указатель на test_struct, это не похоже на работу;Отбрасывание неизвестной ошибки члена:

struct MyStruct *test_pointer = &test_struct;

test_pointer->value = test_pointer->VALUE_1;

Мне просто любопытно, нужно ли обращаться к значениям enum как к глобальным значениям?

test_pointer->value = VALUE_1;

Любые разъяснения были бы весьмаоценили.

Ответы [ 2 ]

6 голосов
/ 05 мая 2011

Предполагаемое использование такой структуры будет выглядеть примерно так:

switch (test_struct.type) {
  case TYPE_1:
    printf("%d", test_struct.value.value_1);
    break;

  case TYPE_2:
    printf("%d", test_struct.value.value_2);
    break;

  case TYPE_3:
    printf("%d", test_struct.value.value_3);
    break;
}

Обратите внимание, что использование заглавных букв VALUE_1, VALUE_2 и VALUE_3 неверно, поскольку они не являются константами, а скорее являются членамиобъединение.

TYPE_1, TYPE_2 и TYPE_3 будут доступны глобально, независимо от того, что соответствующий enum находится в структуре.

1 голос
/ 05 мая 2011

Что происходит с объединением, так это то, что все определенные в нем объекты занимают одну и ту же память.И запрещается читать объект, отличный от последнего записанного.

В

union blah {
    int bleh;
    double blih;
    char bloh[42];
};
union blah myobject;

myobject содержит один из int, double или char[].И нет никаких указаний, какой из них является правильным.Программист должен хранить указание где-то еще:

int lastblahwrite; /* 0: int; 1: double; 2: char[] */
strcpy(myobject.bloh, "The quick brown dog");
lastblahwrite = 2;

, и позже его можно использовать как

switch (lastblahwrite) {
    case 0: printf("%d\n", myobject.bleh); break;
    case 1: printf("%f\n", myobject.blih); break;
    case 2: printf("%s\n", myobject.bloh); break;
    default: assert(!"this didn't happen"); break;
}

Вместо того, чтобы иметь две отдельные переменные, чтобы упростить управление, оноОбычно группируют само объединение и переменную-индикатор в структуру, как в вашем примере.

Управление все еще должно быть написано программистом.Нет ничего автоматического.

...