c++ - 在 c header 中使用来自 c++ header 的枚举类

标签 c++ c enums enum-class extern-c

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

一种丑陋的方法是在 c 函数中使用 int 并将包装函数中的主题转换为枚举类型。但这使 c 函数的用户无法获得有关有效值的线索,并且很难检查该值是否有效。

cpp header

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++ 库中枚举类的好处的好方法是什么?因为它不是我的库,所以我不想更改库中的太多代码。

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

最佳答案

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

cpp header :

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 header 中使用来自 c++ header 的枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72123155/

相关文章:

c++ - For vs While 用于查找链表中的最后一项

c++ - 为什么我在 C++ 代码中得到地址而不是值?

c - 如何在 Git bash 中运行 C 程序?

C `Abort trap: 6` 仅在某些条件下

c++ - 如何在使用 tesseract 时禁用/排除不需要的操作?

c++ - GUI C++ Qt 与 Visual Studio 2010

c - 从 R 语言调用的 C 函数中的动态内存分配

c++ - 我正在阅读开源代码(C++),但不知道为什么他们这样放置枚举

c# - 无法在 Razor View 中获取枚举显示名称属性

enums - 枚举频率 - 错误 UndefinedFunctionError