2010-07-27 33 views
16

以下代码必须在主函数中使用,但我不知道它是如何使用的。如何在ANSI C中的结构中使用枚举?

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新秀,所以不要拍我确定)

+0

是否有一个原因,你不想在struct声明之外使用'typedef enum'? – nmichaels 2010-07-27 15:26:23

+3

那么在编译器的实际失败代码行上? http://catb.org/esr/faqs/smart-questions.html – Dummy00001 2010-07-27 15:29:40

+0

对于第一个错误,你没有显示编译器在抱怨的那一行。对于第二个错误,或者'struct'的定义在那个时候是不可见的,或者你正试图用C++编译器构建C代码。请发布更多的节目。很难做心理调试。 – 2010-07-27 15:30:06

回答

13

你在任何地方都使用指针,所以你需要使用 - >来引用项目。

即。 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; 
} 

(尽管这段代码当然不是跑,因为我不分配用于biglist任何内存和someitem!)

+0

谢谢!你们俩! – TheDudeAbides 2010-07-27 16:19:00

+0

你需要在结构中命名联合有用吗?像西迪克的回答一样。 – user982671 2015-03-31 19:41:19

+0

@ user982671是的,好点,我已经更新了。(作为参考,匿名联合可以在gcc中使用,也可以在C11中使用ANSI C。) – JosephH 2015-04-01 11:40:32

4
biglist.someitem.itemType = MOVIE; /* or = MUSIC */ 

或者,如果someitem是一个指针,

biglist.someitem->itemType = MOVIE; /* or = MUSIC */ 
+0

感谢泰勒,我试图做到这一点,但程序仍然不会编译。我觉得我必须提供额外的代码.. – TheDudeAbides 2010-07-27 15:01:15

+0

您应该发布您正在使用的代码来尝试设置值(包括所有涉及的变量的声明)以及编译器生成的确切错误消息。并将这些东西编辑成你的问题;不要回复它作为评论。 – 2010-07-27 15:03:15

+0

刚刚那样做了。 – TheDudeAbides 2010-07-27 15:16:49

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

你可以用这种方式初始化枚举biglist-> someitem = MOVIE;但是编译器分配的整数值从0开始这样: biglist-> someitem = MOVIE返回0或 biglist-> someitem = MUSIC回报1

检查,如果它可以帮助任何好处,