为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
饮歌长啸 2019-11-21 15:04:47
我不确定使用C枚举的正确语法是什么。我有以下代码:enum {RANDOM, IMMEDIATE, SEARCH} strategy;strategy = IMMEDIATE;但这无法编译,并出现以下错误:error: conflicting types for ‘strategy’error: previous declaration of ‘strategy’ was here我究竟做错了什么?
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

声明枚举变量是这样完成的:


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;


查看完整回答
反对 回复 2019-11-21
?
翻阅古今

TA贡献1780条经验 获得超5个赞

这是值得指出的是,你并不需要一个typedef。你可以像下面这样


enum strategy { RANDOM, IMMEDIATE, SEARCH };

enum strategy my_strategy = IMMEDIATE;

您是否喜欢这是一个风格问题typedef。没有它,如果要引用枚举类型,则需要使用enum strategy。有了它,您可以说strategy。


两种方式各有利弊。一个比较罗word,但将类型标识符保留在标记名称空间中,在这里它们不会与普通标识符冲突(请考虑struct stat和stat函数:它们也不会冲突),并且您会立即看到它是一种类型。另一个较短,但是将类型标识符带入普通名称空间。


查看完整回答
反对 回复 2019-11-21
?
MYYA

TA贡献1868条经验 获得超4个赞

您尝试声明strategy两次,这就是为什么您遇到上述错误的原因。以下作品没有任何投诉(与一起编译gcc -ansi -pendantic -Wall):


#include <stdio.h>


enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;


int main(int argc, char** argv){

    printf("strategy: %d\n", strategy);


    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){

    strategy=SEARCH;

    printf("strategy: %d\n", strategy);


    return 0;

}


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 1324 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信