我不确定使用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
我做错了什么?
当前回答
当你说
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
创建一个名为“strategy”的实例变量。这不是一件非常有用的事情——你需要一个类型定义:
typedef enum {RANDOM, IMMEDIATE, SEARCH} StrategyType;
StrategyType strategy = IMMEDIATE;
其他回答
如前所述,您的代码没有任何问题。你确定你没做过类似的事吗
int strategy;
...
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
错误消息指向哪些行?当它说“以前的‘战略’宣言在这里”时,“这里”是什么?它显示了什么?
当你说
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
创建一个名为“strategy”的实例变量。这不是一件非常有用的事情——你需要一个类型定义:
typedef enum {RANDOM, IMMEDIATE, SEARCH} StrategyType;
StrategyType strategy = IMMEDIATE;
Tarc的答案是最好的。
全会的许多讨论都是在转移话题。
比较以下代码片段:-
int strategy;
strategy = 1;
void some_function(void)
{
}
这给了
error C2501: 'strategy' : missing storage-class or type specifiers
error C2086: 'strategy' : redefinition
用这个编译没有问题。
int strategy;
void some_function(void)
{
strategy = 1;
}
变量策略需要在声明中或在函数中设置。您不能在全局范围内编写任意软件——特别是赋值软件。
他使用enum {RANDOM, IMMEDIATE, SEARCH}而不是int这一事实只是在一定程度上让那些无法超越它的人感到困惑。 问题中的重新定义错误消息表明这是作者做错的地方。
现在你应该可以看出为什么下面的第一个例子是错误的,而其他三个例子是正确的。
例1。错了!
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
void some_function(void)
{
}
例2。正确的。
enum {RANDOM, IMMEDIATE, SEARCH} strategy = IMMEDIATE;
void some_function(void)
{
}
例3。正确的。
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
void some_function(void)
{
strategy = IMMEDIATE;
}
例4。正确的。
void some_function(void)
{
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
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;
@ThoAppelsin in his comment to question posted is right. The code snippet posted in the question it is valid and with no errors. The error you have must be because other bad syntax in any other place of your c source file. enum{a,b,c}; defines three symbolic constants (a, b and c) which are integers with values 0,1 and 2 respectively, but when we use enum it is because we don't usually care about the specific integer value, we care more about the meaning of the symbolic constant name. This means you can have this:
#include <stdio.h>
enum {a,b,c};
int main(){
printf("%d\n",b);
return 0;
}
这个输出是1。
这也是有效的:
#include <stdio.h>
enum {a,b,c};
int bb=b;
int main(){
printf("%d\n",bb);
return 0;
}
并将输出与之前相同的结果。
如果你这样做:
enum {a,b,c};
enum {a,b,c};
你会有一个错误,但是如果你这样做:
enum alfa{a,b,c};
enum alfa;
你不会有任何错误。
你可以这样做:
enum {a,b,c};
int aa=a;
aa是一个值为0的整型变量。但你也可以这样做:
enum {a,b,c} aa= a;
和将具有相同的效果(即aa是一个值为0的int)。
你还可以这样做:
enum {a,b,c} aa= a;
aa= 7;
aa将是int,值为7。
因为你不能使用enum重复符号常量定义,就像我之前说过的,如果你想使用enum声明int变量,你必须使用标签:
enum tag1 {a,b,c};
enum tag1 var1= a;
enum tag1 var2= b;
typedef的使用是为了保证你不用每次都用枚举tag1来定义变量。使用typedef,你可以输入Tag1:
typedef enum {a,b,c} Tag1;
Tag1 var1= a;
Tag1 var2= b;
你还可以有:
typedef enum tag1{a,b,c}Tag1;
Tag1 var1= a;
enum tag1 var2= b;
最后要说的是,因为我们谈论的是定义的符号常量,所以在使用enum时最好使用大写字母,例如:
enum {A,B,C};
而不是
enum {a,b,c};