从lib重新定义枚举

时间:2014-03-16 14:04:44

标签: c++ enums static-libraries

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

静态库:*

namespace Event
{
    enum Type
    {
        None = 0
    };
}

Command::Command()
: fcn()
, event(Event::None)
{
}

原创项目:

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

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

1 个答案:

答案 0 :(得分:1)

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

您可能会考虑让库采用某种类型的普通整数(例如uint32_t或uint64_t),使用0作为默认值,只是让枚举值对库不透明(它们必须是无论如何,因为库已经有了不知道零以外的任何其他值。