C2365 重新定义 VS2019 升级后,以前的定义是外部标头 + lib 的"枚举器"

C2365 redefinition previous deifnition was 'enumerator' for external header+lib after VS2019 upgrade

本文关键字:定义 外部 lib 枚举 新定义 VS2019 C2365      更新时间:2023-10-16

这与重新定义和枚举器以及在单独的枚举类型中重用枚举值以及类似问题相关联。

我有一个VS2013项目,使用来自外部源的标头和库,我无法从中获得新版本。

当我升级到v142/VS2019并编译时,出现错误" C2365'PS_DEFAULT':重新定义;以前的定义是外部标头中的"枚举器"。

除了标头之外,我在代码中的其他任何地方都找不到枚举PARA_STATE或PS_DEFAULT。

标头代码如下所示:

#ifndef GLX_DBMS_H
#define GLX_DBMS_H
...
enum    PARA_STATE                  
{                                   
PS_NDEF,                        
PS_DEFAULT,                     
PS_DEFAULT_LONG,                
PS_PARAM,                       
PS_PARAM_LONG,                  
PS_CONNECTED                    
};
struct Para
{
DATA_TYPE       paraType;                               
WORD            paraTypeLength;                         
char            paraName[SIZEPARANAME];                 
PARA_STATE      strucType;
}
struct ParaV8
{
DATA_TYPE       paraType;                             
WORD            paraTypeLength;                       
char            paraName[SIZEPARANAME];               
PARA_STATE      strucType;  
}                          
...
#endif

2013 年至 2019 年间发生了什么变化,因此不再有效?

除了从外部获取新版本之外,有没有办法解决此问题?

更新

我按照建议查看了Visual studio中的消息,ShObjIdl_core.h中的第3835行有一个带有PS_DEFAULT的枚举,所以这就是原因。

我尝试了两种不同的"解决方案",它们都有效,但都是黑客。

  1. 我在 windows 标题行 3828 中的枚举中添加了类并编译了它。不过这只是一个本地解决方案
enum class PLACEHOLDER_STATES
  1. 更改外部头文件中的名称,我想我只会侥幸逃脱,因为枚举未在其余代码中使用。
enum    PARA_STATE                  
{                                   
PS_NDEF,                        
PS__DEFAULT
};

如果我没看错ShObjIdl_core.h 用于 COM,而外部库使用 COM,所以我无法摆脱依赖关系。

有什么更好的解决方案吗?

就我而言 我在MDefine.h头文件中创建了typedef enum { ME1 = 0,ME2 }MyEnum;。 我试图在CtrlBit.h中使用ME1

主要问题是

在具有MyEnum的MDefine.h不做#pragma once

(是的!!我确信我的变量不可能在其他文件中声明..(


另外,我在stdafx.h中包含MDefine.h

是的!我的问题解决了((