我不确定使用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
我做错了什么?
当前回答
这份声明似乎有些混乱。
如下所示,当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;
其他回答
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;
}
如果你有一个工作的程序,你应该能够将这些代码段粘贴到你的程序中,并看到一些编译和一些不编译。
这份声明似乎有些混乱。
如下所示,当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;
我最喜欢和唯一使用的结构是:
typedef enum MyBestEnum
{
/* good enough */
GOOD = 0,
/* even better */
BETTER,
/* divine */
BEST
};
我相信这会解决你的问题。在我看来,使用新字体是正确的选择。
如前所述,您的代码没有任何问题。你确定你没做过类似的事吗
int strategy;
...
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
错误消息指向哪些行?当它说“以前的‘战略’宣言在这里”时,“这里”是什么?它显示了什么?
我尝试了gcc,并提出了我的需要,我被迫使用最后一种选择,编译出来的错误。
类型定义enum状态{a = 0, b = 1, c = 2}状态;
typedef enum state {a = 0, b = 1, c = 2} state;
typedef enum state old; // New type, alias of the state type.
typedef enum state new; // New type, alias of the state type.
new now = a;
old before = b;
printf("State now = %d \n", now);
printf("Sate before = %d \n\n", before);