gpt4 book ai didi

c++ - 从 lib 重新定义枚举

转载 作者:行者123 更新时间:2023-11-28 07:01:12 25 4
gpt4 key购买 nike

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

静态库:*

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 作为默认值,并让枚举值对库不透明(无论如何它们必须是,因为库有不知道除零以外的任何值)。

关于c++ - 从 lib 重新定义枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22437861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com