别名 C 枚举及其不带 C 样式名称前缀的C++条目



我正在用C和c++ API编写一个库。我需要在C API中编写许多枚举,并将它们包装在c++ API中。

typedef enum PREFIX_SomeType
{
PREFIX_SOME_TYPE_A,
PREFIX_SOME_TYPE_B,
PREFIX_SOME_TYPE_C,
} PREFIX_SomeType;

在c++包装头中,我希望有一个类似的没有名称前缀的enum,因为c++包装API使用了一个名为PREFIX的命名空间。

namespace PREFIX
{
enum SomeType : int
{
SOME_TYPE_A,
SOME_TYPE_B,
SOME_TYPE_C,
};
}

由于这两个枚举是不同的枚举,它们不能完全相互转换。当我在C api中定义包含枚举的结构体时,我希望使用c++别名。

typedef struct PREFIX_ApiStruct
{
PREFIX_SomeType type;
// ...
} PREFIX_ApiStruct;

在c++包装器中:

using namespace PREFIX
{
using ApiStruct = PREFIX_ApiStruct;
}

但是,当尝试使用c++包装器时,我们不能赋值一个c++ enum…

ApiStruct instance;
instance.type = SOME_TYPE_A; // Error!

是否有一种方法可以让c++用户不写PREFIX_类型,而是使用c++名称空间,而不需要显式强制转换?

X-MACRO有帮助吗?

在共享的。h:

#define SOME_TYPE   
X(SOME_TYPE_A)  
X(SOME_TYPE_B)  
X(SOME_TYPE_C)

C部分:

typedef enum PREFIX_SomeType
{
#define X(type) PREFIX_##type,
SOME_TYPE
#undef X
} PREFIX_SomeType;

c++部分:

namespace PREFIX
{
enum SomeType : int
{
#define X(type) type,
SOME_TYPE
#undef X
};
}

我能想到的最接近的解决方案是使用c++ 17做:

inline constexpr PREFIX_SomeType SOME_TYPE_A = PREFIX_SOME_TYPE_A;
inline constexpr PREFIX_SomeType SOME_TYPE_B = PREFIX_SOME_TYPE_B;
inline constexpr PREFIX_SomeType SOME_TYPE_C = PREFIX_SOME_TYPE_C;

这与语法高亮显示有些混乱,但我没有看到更好的替代方案,而不是重新实现c++结构。这也很容易通过x-macro生成。

相关内容

  • 没有找到相关文章

最新更新