我不确定使用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 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;
其他回答
值得指出的是,您不需要类型定义。你可以像下面这样做
enum strategy { RANDOM, IMMEDIATE, SEARCH };
enum strategy my_strategy = IMMEDIATE;
这是一个风格问题,你是否喜欢typedef。如果没有它,如果要引用枚举类型,则需要使用枚举策略。有了它,你可以说策略。
两种方法都有优缺点。一种方法比较冗长,但将类型标识符保留在标记名称空间中,在那里它们不会与普通标识符冲突(想想struct stat和stat函数:它们也不冲突),并且在那里您立即看到它是一个类型。另一个较短,但将类型标识符引入普通名称空间。
声明一个枚举变量是这样的:
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;
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 {RANDOM, IMMEDIATE, SEARCH} strategy;
创建一个名为“strategy”的实例变量。这不是一件非常有用的事情——你需要一个类型定义:
typedef enum {RANDOM, IMMEDIATE, SEARCH} StrategyType;
StrategyType strategy = IMMEDIATE;
值得一提的是,在c++中,你可以使用“enum”来定义一个新类型,而不需要typedef语句。
enum Strategy {RANDOM, IMMEDIATE, SEARCH};
...
Strategy myStrategy = IMMEDIATE;
我发现这种方法更友好。
[编辑-澄清c++状态-我原来有这个,然后删除它!]]