[英]Sharing an enum from C#, C++/CLI, and C++
即使您在本机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,
};
}
在您的C ++ / CLI代码中,包含如下内容:
#undef MANAGED
#include "shared_enum.h"
#define MANAGED
#include "shared_enum.h"
这使您EnumShareManaged::MyEnum
在C ++ / CLI代码中区分这两种枚举EnumShare::MyEnum
或EnumShareManaged::MyEnum
。
编辑:刚刚发现这个SO帖子显示了在非托管和托管枚举之间进行转换的正确方法,这肯定也会在这里工作。 例如,在C ++ / CLI中,从托管到非托管枚举的转换可以这样完成:
void MyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnum mx)
{
EnumShare::MyEnum nx = static_cast<EnumShare::MyEnum>(mx);
// call a native function "func"
func(nx);
}
考虑编写代码生成器程序,该程序使用枚举读取本机h文件文件并生成另一个h文件,将枚举转换为C ++ / CLI枚举类。 此类代码生成器可用于Custom Build Step上的C ++ / CLI项目,从而生成所需的CLI枚举。
我使用这种方法生成本机包装类,以便在非托管C ++中获取Enum :: GetNames和Enum :: GetName函数。
只需将#include "Enum.cs"
指令放在外部命名空间中即可解决命名冲突问题。
编辑:Brent建议的变体是使用#define
替换.cs文件中声明的命名空间之一(甚至是枚举名称本身)。 这也避免了命名冲突,而不会使命名空间层次结构更深入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.