2010-06-11 108 views
1

我正在将MFC应用程序中的死锁检测转换为简单控制台应用程序。 在这个过程中,我发现很多错误说,像重新定义错误

错误C2365:'CmdLockMutex':重新定义;先前的定义是'enumerator'

我无法删除此错误。 如果有人能帮助我这方面的话,请很好。

+4

只是一个猜测:你的错误是在第37行左右。我不能说没有看到代码更准确。 – ereOn 2010-06-11 14:24:20

+0

如果您发布了一些代码,它可能会帮助我们帮助您。 – Mawg 2010-06-11 14:24:34

+0

发布导致错误的代码 – 2010-06-11 14:24:38

回答

4

听起来就像你需要一个头部守卫围绕你的CmdLockMutex的定义(在它的.h文件的顶部添加#pragma once)。或者说你有一个命名冲突。

也许你有这样的事情:

enum MyEnum { MyEnumVal1, MyEnumVal2 }; 

//.... 

class MyEnum 
{ 

}; 
+0

保存了我的一天。视觉工作室的错误是如此混乱。 – 2016-04-12 04:49:19

0

显而易见的答案是,你必须prevously使用的名称CmdLockMutex - 可能在enum。搜索你的代码的所有“CmdLockMutex”出现

1

我有这样的问题,其中一些代码定义放在一个头文件。标题包含在两个地方,与自身冲突。我的解决方案是将它们移到自己的cpp文件中。你可能会看到类似的东西。

另一个原因可能是未能在页眉中使用#pragma或使用#ifndef技术进行包装。

+0

在第一种情况下,如果包含警卫出现,你会得到一个链接器错误,而不是编译器错误;在这种情况下,标题并不严格与自身相冲突,而是在单独的编译单元中出现冲突的定义。所以,由于这是一个编译器错误,通过赌注是第二(不包括警卫)。所有的好点子,但。 – Clifford 2010-06-11 14:37:13

+0

@Clifford - 我同意。对我来说,第一部分是链接器冲突。 – 2010-06-11 14:47:50

3

OK 4年后到OP这里是你的答案...

问题: 随着无范围的枚举,你可以有这样的情况:

enum Suit { Diamonds, Hearts, Clubs, Spades }; 
enum Tools { Picks, Shovels, Spades, Hammers }; // error C2365: 'Spades' : 
               // redefinition; previous definition was 'enumerator' 

解决方案:

Scoped enums solve this problem: 
enum class Suit { Diamonds, Hearts, Clubs, Spades }; 
enum class Tools { Picks, Shovels, Spades, Hammers }; 

来源:MSDN

使用在枚举定义关键字类或结构的指示 每个枚举类型是独特的,不具有可比性其他枚举类型。 除了这个优点之外,您还可以在不指定基础类型的情况下向前声明它们 (如果您打算前向声明,则使用不规范的枚举 )。