我正在围绕一个c++库编写一个c包装器.

一种丑陋的方法是在c函数中使用int,并将包装函数中的主题转换为枚举类型.但这让c函数的用户对有效值一无所知,而且很难判断该值是否有效.

cpp头

namespace GPIO
{
    enum class Directions
    {
        UNKNOWN,
        OUT,
        IN,
        HARD_PWM
    };

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

c包装头

    int setup(int channel, int direction, int initial);

c包装器代码

   int setup(int channel, int direction, int initial)
   {
        GPIO::setup(channel, static_cast<GPIO::Directions>(direction), initial);
        return 0;
    }

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

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

推荐答案

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

cpp标题:

namespace GPIO
{    
    enum class Directions
    {
        UNKNOWN,
        OUT,
        IN,
        HARD_PWM,
        SIZE
    };
}

c包装头:

enum GPIO_Directions
{
    GPIO_Directions_UNKNOWN,
    GPIO_Directions_OUT,
    GPIO_Directions_IN,
    GPIO_Directions_HARD_PWM,
    GPIO_Directions_SIZE
};

c包装器代码:

   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;
    }

C++相关问答推荐

C/C++中的状态库

找出文件是否包含给定的文件签名

在C中使用JMP_buf数组进行线程化(在xv6中测试)

为什么输出不是从上到下C

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

为什么该函数不将参数值保存到数据 struct 中?

防止C++中递归函数使用堆栈内存

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

我的C函数起作用了,但我不确定为什么

C语言中神秘的(我认为)缓冲区溢出

C标准关于外部常量的说明

如何修复我的qsort()算法?它每次都给出不同的结果

基于蝶数恰好有8个除数的事实的代码

问题:C#Define上的初始值设定项元素不是常量

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

共享内存未授予父进程权限

与指针的原始C数组或C++向量<;向量<;双>>;

C 语言中霍尔分区的快速排序算法

如何根据当前舍入方向将float转换为int?

计算 e^x 很好.但不是 x 的罪