gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:52:42 25 4
gpt4 key购买 nike

我正在围绕 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com