如何在C中定义枚举类型(枚举)?

我不确定使用C枚举的正确语法是什么。我有以下代码:


enum {RANDOM, IMMEDIATE, SEARCH} strategy;

strategy = IMMEDIATE;

但这无法编译,并出现以下错误:


error: conflicting types for ‘strategy’

error: previous declaration of ‘strategy’ was here

我究竟做错了什么?


饮歌长啸
浏览 1324回答 3
3回答

料青山看我应如是

声明枚举变量是这样完成的:enum strategy {RANDOM, IMMEDIATE, SEARCH};enum strategy my_strategy = IMMEDIATE;但是,您可以使用a typedef来缩短变量声明,如下所示:typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;strategy my_strategy = IMMEDIATE;有一个命名约定来区分类型和变量是一个好主意:typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type;strategy_type my_strategy = IMMEDIATE;

翻阅古今

这是值得指出的是,你并不需要一个typedef。你可以像下面这样enum strategy { RANDOM, IMMEDIATE, SEARCH };enum strategy my_strategy = IMMEDIATE;您是否喜欢这是一个风格问题typedef。没有它,如果要引用枚举类型,则需要使用enum strategy。有了它,您可以说strategy。两种方式各有利弊。一个比较罗word,但将类型标识符保留在标记名称空间中,在这里它们不会与普通标识符冲突(请考虑struct stat和stat函数:它们也不会冲突),并且您会立即看到它是一种类型。另一个较短,但是将类型标识符带入普通名称空间。

MYYA

您尝试声明strategy两次,这就是为什么您遇到上述错误的原因。以下作品没有任何投诉(与一起编译gcc -ansi -pendantic -Wall):#include <stdio.h>enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;int main(int argc, char** argv){&nbsp; &nbsp; printf("strategy: %d\n", strategy);&nbsp; &nbsp; return 0;}如果不是上述内容,则将第二行更改为:...enum { RANDOM, IMMEDIATE, SEARCH } strategy;strategy = IMMEDIATE;...从警告中,您可以轻松看到您的错误:enums.c:5:1: warning: data definition has no type or storage class [enabled by default]enums.c:5:1: warning: type defaults to ‘int’ in declaration of ‘strategy’ [-Wimplicit-int]enums.c:5:1: error: conflicting types for ‘strategy’enums.c:4:36: note: previous declaration of ‘strategy’ was here因此,编译器接受strategy = IMMEDIATE了一个声明为strategydefault type 的变量的声明int,但是之前已经有一个使用此名称的变量声明。但是,如果您将分配放在main()函数中,则它将是有效的代码:#include <stdio.h>enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;int main(int argc, char** argv){&nbsp; &nbsp; strategy=SEARCH;&nbsp; &nbsp; printf("strategy: %d\n", strategy);&nbsp; &nbsp; return 0;}
打开App,查看更多内容
随时随地看视频慕课网APP