首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c#头中使用来自c++头的枚举类

在c#头中使用来自c++头的枚举类
EN

Stack Overflow用户
提问于 2022-05-05 07:03:48
回答 2查看 303关注 0票数 2

我正在围绕一个c++库编写一个c包装器。在c++中,有一些枚举类用作函数参数的类型。如何在c头中正确地使用主题。

一种丑陋的方法是在c函数中使用int's,并在包装器函数中将主题转换为enum类型。但是,这使c函数的用户对有效值一无所知,而且很难检查该值是否有效。

cpp报头

代码语言:javascript
复制
namespace GPIO
{
    enum class Directions
    {
        UNKNOWN,
        OUT,
        IN,
        HARD_PWM
    };

    void setup(int channel, Directions direction, int initial = -1);
}

C包装头

代码语言:javascript
复制
    int setup(int channel, int direction, int initial);

C包装码

代码语言:javascript
复制
   int setup(int channel, int direction, int initial)
   {
        GPIO::setup(channel, static_cast<GPIO::Directions>(direction), initial);
        return 0;
    }

给c函数的用户提供c++库中枚举类的好处的好方法是什么?因为它不是我的库,所以我不想过多地更改库中的代码。

可以选择将枚举类提取到不同的文件中,并将其包含在原始标头中。但是我不知道如何正确地定义它,所以我不需要更改cpp库中的命名,仍然可以在c头中使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-05 08:13:25

你做不到。从C代码中使用C++特性是不可能的。您正在为C++函数创建C包装器,为什么不能为枚举创建C包装器呢?唯一的问题是如何确保两个枚举具有相同的值。您可以在小代码更改后检查它的编译时间:

cpp标题:

代码语言:javascript
复制
namespace GPIO
{    
    enum class Directions
    {
        UNKNOWN,
        OUT,
        IN,
        HARD_PWM,
        SIZE
    };
}

C包装头:

代码语言:javascript
复制
enum GPIO_Directions
{
    GPIO_Directions_UNKNOWN,
    GPIO_Directions_OUT,
    GPIO_Directions_IN,
    GPIO_Directions_HARD_PWM,
    GPIO_Directions_SIZE
};

C包装代码:

代码语言:javascript
复制
   int setup(int channel, GPIO_Direction direction, int initial)
   {
       static_assert(GPIO::Directions::SIZE == GPIO_Directions_SIZE, 
                       "c wrapper enum  must be equal to c++ enum");             
       GPIO::setup(channel, static_cast<GPIO::Directions>(direction), initial);
       return 0;
    }
票数 4
EN

Stack Overflow用户

发布于 2022-05-05 07:49:12

您不能使用C语言中的C++代码,因为它不是用语言的公共子集编写的。

您可以在C包装器中定义相应的枚举,例如:

代码语言:javascript
复制
// C
enum Wrapper_Directions
{
    Wrapper_Directions_UNKNOWN,
    Wrapper_Directions_OUT,
    Wrapper_Directions_IN,
    Wrapper_Directions_HARD_PWM,
};

int wrapper_setup(int channel, enum Wrapper_Directions direction, int initial);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72123155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档