[英]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.