gpt4 book ai didi

c++ - 这个 C++ 转换为枚举有问题吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:32 28 4
gpt4 key购买 nike

给定以下代码:

enum Options
{
Surf = 0x01,
Out = 0x02
};

Options all = (Options) ( Surf | Out);
  1. 这个选角有问题吗?
  2. 如果这个转换有意义,那为什么?

根据我的理解,Options只定义了两个变量。值 0x03 有何意义?

最佳答案

Does this casting have problems?

没有。

If this casting make sense, then why? Based on my understanding, Options only defines two variables, how the value 0x03 makes sense?

枚举类型 Options 有两个命名的枚举数,但它表示的值的范围足够大,可以用作包含每个枚举数的位域。

简而言之:是的,对这样的位域使用枚举是有效且定义明确的。

按照对此答案的评论中的要求,可以在 C++ 标准 (C++03 7.2/6) 中找到允许这样做的正式语言:

For an enumeration where emin is the smallest enumerator and emax is the largest, the values of the enumeration are the values of the underlying type in the range bmin to bmax, where bmin and bmax are, respectively, the smallest and largest values of the smallest bit-field that can store emin and emax.

It is possible to define an enumeration that has values not defined by any of its enumerators.

关于这是否是好的风格存在一些争论。当然可以争论的是,通常假设枚举对象只能存储它的枚举数之一,因此这样的代码可能会造成混淆并且容易出错。

另一方面,我认为当枚举旨在用作位域时通常是非常明显的。通常这样的枚举是用 OptionsFlags 后缀或类似的东西命名的。同样,如果每个枚举器都有一个显然是单个设置位的设置值,则该枚举可能旨在用作位域。

关于c++ - 这个 C++ 转换为枚举有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695843/

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