Doc*_*own 11
即使您在本机C++中包含C#枚举(如第一个链接中所示),两个枚举都不是"相同",C++枚举只是一个命名整数列表,而C#枚举是从Enum派生的.因此,在尝试同时使用它们时,您会在C++/CLI中发生冲突.
一种可能的解决方案是使用预处理器,以便C++/CLI程序集在不同的名称空间中看到两个枚举:
// shared_enum.h
#undef ENUMKEYWORD
#undef ENUMNAMESPACE
#ifdef MANAGED
#define ENUMKEYWORD public enum class
#define ENUMNAMESPACE EnumShareManaged
#else
#define ENUMKEYWORD enum
#define ENUMNAMESPACE EnumShare
#endif
namespace ENUMNAMESPACE
{
ENUMKEYWORD MyEnum
{
a = 1,
b = 2,
c = 3,
};
}
Run Code Online (Sandbox Code Playgroud)
在您的C++/CLI代码中,包含如下内容:
#undef MANAGED
#include "shared_enum.h"
#define MANAGED
#include "shared_enum.h"
Run Code Online (Sandbox Code Playgroud)
这使您可以区分这两种枚举
EnumShare::MyEnum或EnumShareManaged::MyEnumC++/CLI代码.
编辑:刚刚发现这篇SO帖子显示了在非托管和托管枚举之间进行转换的正确方法,这肯定也适用于此.例如,在C++/CLI中,从托管到非托管枚举的转换可以这样完成:
void MyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnum mx)
{
EnumShare::MyEnum nx = static_cast<EnumShare::MyEnum>(mx);
// call a native function "func"
func(nx);
}
Run Code Online (Sandbox Code Playgroud)
只需将#include "Enum.cs"指令放入外部命名空间即可解决命名冲突。
编辑:Brent 建议的一种变体是用来#define替换 .cs 文件中声明的命名空间之一(甚至枚举名称本身)。这也避免了命名冲突,而不会使命名空间层次结构更深。
| 归档时间: |
|
| 查看次数: |
17359 次 |
| 最近记录: |