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

时间:2011-01-14 20:54:44

标签: c++ enums casting

给出以下代码:

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

Options all = (Options) ( Surf | Out);
  1. 这个演员有问题吗?
  2. 如果这个演员有意义,那么为什么?
  3. 根据我的理解,Options只定义了两个变量。值0x03如何有意义?

5 个答案:

答案 0 :(得分:7)

  

这个演员有问题吗?

没有

  

如果这个演员有意义,为什么呢?根据我的理解,Options只定义了两个变量,值0x03如何有意义?

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

简而言之:是的,对于像这样的位域使用枚举是有效且定义良好的。

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

  

对于 e min 是枚举最小的枚举, e max 是最大值,枚举的值是 b min b max 范围内的基础类型的值,其中 b min b max 分别是可存储的最小位字段的最小值和最大值< em> e min e max

     

可以定义一个枚举,该枚举的值不是由任何枚举器定义的。

关于这是否是好风格存在争议。当然可以认为,通常假设枚举对象只能存储其枚举器之一,因此这样的代码可能会令人困惑且容易出错。

另一方面,我认为当枚举用作位域时通常很明显。通常这样的枚举以OptionsFlags后缀或类似名称命名。同样,如果每个枚举器的设定值明显是单个设置位,则该枚举可能用作位域。

答案 1 :(得分:1)

Q1&GT;是。当你看起来想要一个位掩码时,你正在使用枚举。

Q2&GT;你是对的,没有意义。使用枚举意味着变量all将等于Options中的一个项目,而不是多个项目的组合或多个项目的组合。

答案 2 :(得分:0)

除了一些语法问题,您的代码确实有效。 但它有点俗气。枚举是整数,但是在样式方面,你应该坚持枚举中实际存在的值。

也许为bitwise-collection使用不同的int。 &安培;我猜是小心分配2的幂。如果你真的想要按位设置。

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

答案 3 :(得分:0)

枚举只是int值的占位符,所以当你按位或它们得到这个:二进制(4位表示,所以对我来说更容易): 0001 | 0010 = 0011或3.枚举可以是任何值,甚至是完全无效的值。

答案 4 :(得分:0)

你可能会为enum类型变量分配一个任意整数值,但它的风格很糟糕。与往常一样,代码首先是可读性,然后是编译器。期望枚举变量只能保存有效的枚举常量。

我会将最后一行更改为:

int all = ( Surf | Out);