我不确定使用C枚举的正确语法是什么。我有以下代码:
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
但是这不能编译,会出现以下错误:
error: conflicting types for ‘strategy’
error: previous declaration of ‘strategy’ was here
我做错了什么?
我不确定使用C枚举的正确语法是什么。我有以下代码:
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
但是这不能编译,会出现以下错误:
error: conflicting types for ‘strategy’
error: previous declaration of ‘strategy’ was here
我做错了什么?
当前回答
如前所述,您的代码没有任何问题。你确定你没做过类似的事吗
int strategy;
...
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
错误消息指向哪些行?当它说“以前的‘战略’宣言在这里”时,“这里”是什么?它显示了什么?
其他回答
值得一提的是,在c++中,你可以使用“enum”来定义一个新类型,而不需要typedef语句。
enum Strategy {RANDOM, IMMEDIATE, SEARCH};
...
Strategy myStrategy = IMMEDIATE;
我发现这种方法更友好。
[编辑-澄清c++状态-我原来有这个,然后删除它!]]
当你说
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
创建一个名为“strategy”的实例变量。这不是一件非常有用的事情——你需要一个类型定义:
typedef enum {RANDOM, IMMEDIATE, SEARCH} StrategyType;
StrategyType strategy = IMMEDIATE;
声明一个枚举变量是这样的:
enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy my_strategy = IMMEDIATE;
但是,你可以使用typedef来缩短变量声明,如下所示:
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy my_strategy = IMMEDIATE;
有一个命名约定来区分类型和变量是一个好主意:
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type;
strategy_type my_strategy = IMMEDIATE;
你尝试两次声明策略,这就是为什么你会得到上面的错误。以下工作没有任何抱怨(编译gcc -ansi - petic -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来声明一个默认类型为int的名为strategy的变量,但之前已经声明了一个具有此名称的变量。
然而,如果你把赋值放在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;
}
这份声明似乎有些混乱。
如下所示,当strategy出现在{RANDOM, IMMEDIATE, SEARCH}之前时,
enum strategy {RANDOM, IMMEDIATE, SEARCH};
您正在创建一个名为enum策略的新类型。但是,在声明变量时,需要使用枚举策略本身。你不能只使用策略。所以下面的内容无效。
enum strategy {RANDOM, IMMEDIATE, SEARCH};
strategy a;
但是,以下是有效的
enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy queen = RANDOM;
enum strategy king = SEARCH;
enum strategy pawn[100];
当strategy出现在{RANDOM, IMMEDIATE, SEARCH}后面时,您正在创建一个匿名枚举,然后将strategy声明为该类型的变量。
现在,你可以这样做
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = RANDOM;
但是,您不能声明任何其他类型为enum {RANDOM, IMMEDIATE, SEARCH}的变量,因为您从未命名过它。所以下面的内容无效
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
enum strategy a = RANDOM;
你也可以把这两个定义结合起来
enum strategy {RANDOM, IMMEDIATE, SEARCH} a, b;
a = RANDOM;
b = SEARCH;
enum strategy c = IMMEDIATE;
前面提到的Typedef用于创建更短的变量声明。
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
现在你已经告诉编译器enum {RANDOM, IMMEDIATE, SEARCH}是策略的同义词。所以现在你可以自由地使用策略作为变量类型。你不再需要输入enum strategy。以下是现在有效的
strategy x = RANDOM;
你也可以结合Typedef和枚举名称来获取
typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;
使用这个方法除了可以互换使用strategy和enum strategyName之外没有太多的好处。
typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;
enum strategyName a = RANDOM;
strategy b = SEARCH;