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

nbnkbykc  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(127)

我正在用C和C++ API编写一个库。我需要用C API编写许多枚举,然后用C++ API Package 它们。

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

在C++ Package 头中,我希望有一个类似的没有名称前缀的枚举,因为C++ Package 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++ Package 器中:

using namespace PREFIX
{

using ApiStruct = PREFIX_ApiStruct;

}

但是,当尝试使用C++ Package 器时,我们无法分配C++枚举...

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

有没有一种方法可以让C用户不用写出PREFIX_类型,而是使用C命名空间,而不需要显式强制转换?

6ss1mwsb

6ss1mwsb1#

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

}
2g32fytz

2g32fytz2#

我能想到的最接近的解决方案是使用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++结构。

相关问题