我正在围绕一个c++库编写一个c包装器。在c++中,有一些枚举类用作函数参数的类型。如何在c头中正确地使用主题。
一种丑陋的方法是在c函数中使用int's,并在包装器函数中将主题转换为enum类型。但是,这使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++库中枚举类的好处的好方法是什么?因为它不是我的库,所以我不想过多地更改库中的代码。
可以选择将枚举类提取到不同的文件中,并将其包含在原始标头中。但是我不知道如何正确地定义它,所以我不需要更改cpp库中的命名,仍然可以在c头中使用它。
发布于 2022-05-05 08:13:25
你做不到。从C代码中使用C++特性是不可能的。您正在为C++函数创建C包装器,为什么不能为枚举创建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;
}发布于 2022-05-05 07:49:12
您不能使用C语言中的C++代码,因为它不是用语言的公共子集编写的。
您可以在C包装器中定义相应的枚举,例如:
// 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);https://stackoverflow.com/questions/72123155
复制相似问题