代码之家  ›  专栏  ›  技术社区  ›  Brent Arias

从C、C++、CLI和C++中共享枚举

  •  23
  • Brent Arias  · 技术社区  · 14 年前

    我有一个由三部分组成的图书馆。首先是本地C++,它提供了实际的功能。第二个是C++库的C++/CLI包装/适配器,以简化C到C++的转换。最后,我有一个C++库,它通过C++/CLI适配器调用C++库。

    现在,我有两组并行枚举定义,一组存储在.cs文件中,另一组存储在.h文件中。这带来了一个双重问题:

    1. 我有双重保养。我必须始终同步两个文件位置中枚举的更改。
    2. 两个枚举使用的命名空间应该是相同的,但是C++/CLI包装器,它既能查看枚举集,又能在它们之间转换,会引起命名冲突。

    现在我不确定解决办法,比如 this that 将解决 二者都 问题。思想?

    3 回复  |  直到 9 年前
        1
  •  2
  •   Brent Arias    9 年前

    只要把你的 #include "Enum.cs" 用于解决命名冲突的外部命名空间中的指令。

    编辑:布伦特建议的一个变化是使用 #define 替换.cs文件中声明的一个命名空间(甚至枚举名称本身)。这也避免了命名冲突,而不会使名称空间层次结构更深。

        2
  •  10
  •   Community clintgh    7 年前

    即使你在你的本机C++中包含了C~*EnEnm(如你所建议的那样) first link 两个枚举都不是“相同的”,c++eNUM只是一个命名整数的列表,而C ^枚举是从枚举中派生出来的。因此,当试图同时使用它们时,会在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"
    

    这使您可以区分这两种枚举 EnumShare::MyEnum EnumShareManaged::MyEnum 在C++/CLI代码中。

    编辑:刚刚找到 this SO post 显示了在非托管枚举和托管枚举之间进行强制转换的正确方法,这在这里肯定也会起作用。例如,在C++/CLI中,从托管到非托管枚举的转换可以这样做:

    void MyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnum mx)
    {
        EnumShare::MyEnum nx = static_cast<EnumShare::MyEnum>(mx);
        // call a native function "func"
        func(nx);
    }
    
        3
  •  3
  •   Alex F    14 年前

    考虑编写代码生成器程序,用枚举读取本地H文件文件,生成另一个H文件,将枚举转换为C++/CLI枚举类。这样的代码生成器可以在自定义生成步骤的C++/CLI项目中使用,生成所需的CLI枚举。

    我使用这种方法来生成本地包装器类以获得EnUM::GETNAMS和EnUM::GETNEX函数在非托管C++中。