Как использовать enum в структуре в ANSI C? - PullRequest
16 голосов
/ 27 июля 2010

Следующий код должен использоваться в основной функции, но я не знаю, как он используется.

struct SomeItem
{
    enum {MOVIE, MUSIC} itemType;
    union {
        struct Movie* movie;
        struct Music* music;
    };
};

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

Мне нужно знать, как это будет выглядеть в основной функции.

biglist.someitem = ???;
/* declaration I use */
struct Library* biglist;

больше кода, чтобы понять, что я пытаюсь сделать.

struct Library{
struct SomeItem* someitem;
struct SomeItem* previousItem;
struct SomeItem* nextItem;
};

ошибки компилятора: C2037: слева от 'someitem' указана неопределенная структура / объединение 'библиотека' C2065: ФИЛЬМ: необъявленный идентификатор

Я все еще новичок в ANSI C, так что не стреляйте в меня нормально;)

Ответы [ 4 ]

13 голосов
/ 27 июля 2010

Вы используете указатели повсюду, поэтому вам нужно использовать -> для ссылки на элементы.

т. biglist->someitem->itemType = MOVIE;

Приведенный ниже код прекрасно компилируется с помощью gcc -Wall -strict:

struct SomeItem
{
    enum {MOVIE, MUSIC} itemType;
    union {
        struct Movie* movie;
        struct Music* music;
    } item;
};

struct Library{
   struct SomeItem* someitem;
   struct SomeItem* previousItem;
   struct SomeItem* nextItem;
};

int main(void)
{
   struct Library* biglist;

   biglist->someitem->itemType = MOVIE;

   return 0;
}

(Хотя этот код, конечно, не будет работать, так как я не выделяю память для больших списков и других объектов!)

4 голосов
/ 27 июля 2010
biglist.someitem.itemType = MOVIE; /* or = MUSIC */

Или, если someitem - указатель,

biglist.someitem->itemType = MOVIE; /* or = MUSIC */
0 голосов
/ 27 июля 2010

Вы можете инициализировать перечисление таким образом: biglist-> someitem = MOVIE; но компилятор присваивает целочисленные значения, начиная с 0. Итак: biglist-> someitem = MOVIE возвращает 0 или biglist-> someitem = MUSIC return 1

проверь, поможет ли это,

0 голосов
/ 27 июля 2010
struct SomeItem 
{ 
    enum {MOVIE, MUSIC} itemType; 
    union { 
        struct Movie* movie; 
        struct Music* music; 
    } item;
    struct SomeItem *next;
}; 
...