我正在用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生成。