如何在ANSI C中的结构中使用枚举?
以下代码必须在主函数中使用,但我不知道它是如何使用的。如何在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新秀,所以不要拍我确定)
你在任何地方都使用指针,所以你需要使用 - >来引用项目。
即。 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!)
谢谢!你们俩! – TheDudeAbides 2010-07-27 16:19:00
你需要在结构中命名联合有用吗?像西迪克的回答一样。 – user982671 2015-03-31 19:41:19
@ user982671是的,好点,我已经更新了。(作为参考,匿名联合可以在gcc中使用,也可以在C11中使用ANSI C。) – JosephH 2015-04-01 11:40:32
biglist.someitem.itemType = MOVIE; /* or = MUSIC */
或者,如果someitem
是一个指针,
biglist.someitem->itemType = MOVIE; /* or = MUSIC */
感谢泰勒,我试图做到这一点,但程序仍然不会编译。我觉得我必须提供额外的代码.. – TheDudeAbides 2010-07-27 15:01:15
您应该发布您正在使用的代码来尝试设置值(包括所有涉及的变量的声明)以及编译器生成的确切错误消息。并将这些东西编辑成你的问题;不要回复它作为评论。 – 2010-07-27 15:03:15
刚刚那样做了。 – TheDudeAbides 2010-07-27 15:16:49
struct SomeItem
{
enum {MOVIE, MUSIC} itemType;
union {
struct Movie* movie;
struct Music* music;
} item;
struct SomeItem *next;
};
你可以用这种方式初始化枚举biglist-> someitem = MOVIE;但是编译器分配的整数值从0开始这样: biglist-> someitem = MOVIE返回0或 biglist-> someitem = MUSIC回报1
检查,如果它可以帮助任何好处,
是否有一个原因,你不想在struct声明之外使用'typedef enum'? – nmichaels 2010-07-27 15:26:23
那么在编译器的实际失败代码行上? http://catb.org/esr/faqs/smart-questions.html – Dummy00001 2010-07-27 15:29:40
对于第一个错误,你没有显示编译器在抱怨的那一行。对于第二个错误,或者'struct'的定义在那个时候是不可见的,或者你正试图用C++编译器构建C代码。请发布更多的节目。很难做心理调试。 – 2010-07-27 15:30:06