从lib重新定义enum



我一直在将代码从我的项目移动到静态库。最近,我将一个命令系统移到了静态库中,但保留了事件,因为它们是特定于项目的。但是,我在命令构造函数中使用的一个事件是默认的。我最后做的是用构造函数定义这个事件,然后允许原始项目重新定义这个命令并定义其余的事件。

静态库:*

namespace Event
{
    enum Type
    {
        None = 0
    };
}
Command::Command()
: fcn()
, event(Event::None)
{
}
原始项目:

namespace Event
{
    enum Type
    {
        None    = 0,
        Enemey  = 1 << 0,
        Player  = 1 << 1,
    }
}

以这种方式重新定义枚举是一个糟糕的设计选择吗?

这在c++中是非法的,因为它违反了单定义规则(ODR)。例如,编译器可以根据枚举的内容选择一个合理的宽度(以字节为单位)。如果一个声明只有一个值,并且是0,而另一个声明有很多值,这些值可能很大,那么你最终会得到两个不同的(不兼容的)关于枚举类型有多宽的概念。这是行不通的,而且违反了语言要求。

你可以考虑让库接受某种类型的普通整数(例如uint32_t或uint64_t),使用0作为默认值,并让枚举值对库是不透明的(它们必须是,因为库不知道除零以外的任何值)。

相关内容

  • 没有找到相关文章

最新更新