C2365 重新定义 VS2019 升级后,以前的定义是外部标头 + lib 的"枚举器"
C2365 redefinition previous deifnition was 'enumerator' for external header+lib after VS2019 upgrade
这与重新定义和枚举器以及在单独的枚举类型中重用枚举值以及类似问题相关联。
我有一个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的枚举,所以这就是原因。
我尝试了两种不同的"解决方案",它们都有效,但都是黑客。
- 我在 windows 标题行 3828 中的枚举中添加了类并编译了它。不过这只是一个本地解决方案
enum class PLACEHOLDER_STATES
- 更改外部头文件中的名称,我想我只会侥幸逃脱,因为枚举未在其余代码中使用。
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
是的!我的问题解决了((
相关文章:
- 具有外部"c"和程序集的未定义函数
- C++编程从外部文本文件定义数组大小
- 良好做法:如何定义用于编译的外部库的路径
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名
- 模板类外部的长定义的替代项
- 使用带有 CMake 和 Conan 的外部库的未定义引用
- 可视化C++外部定义内联函数
- 具有外部定义的默认特殊成员函数
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 删除 PCL 可视化工具中定义的 3D 框外部的点
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 为什么在类外部(但在头文件中)定义的类成员函数必须内联?
- 如何在命名空间中声明外部全局,然后定义它?
- 使用静态变量未解析的外部符号/未定义的引用时出错
- 自定义对象构造函数在循环外部循环
- 我可以有一个从外部不可见但未在标头中定义的静态友元函数吗?
- 创建类时已定义的未解析外部符号
- 定义外部时未解析的外部符号"struct API Api"
- 为将来的'unset'变量定义外部变量是否是一种好的做法?
- 在同一头文件中定义外部变量