我正在用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命名空间,而不需要显式强制转换?
2条答案
按热度按时间6ss1mwsb1#
X-MACRO有帮助吗?
在共享.h中:
在C部分:
在C++部分:
2g32fytz2#
我能想到的最接近的解决方案是使用C++17来完成:
这确实会在一定程度上扰乱语法突出显示,但我看不到一个更好的替代方案,除非重新实现C++结构。