C++ 这是C++;强制转换到枚举有问题吗?

C++ 这是C++;强制转换到枚举有问题吗?,c++,enums,casting,C++,Enums,Casting,给定以下代码: enum Options { Surf = 0x01, Out = 0x02 }; Options all = (Options) ( Surf | Out); 这个铸件有问题吗 如果这个角色有意义,那为什么呢 根据我的理解,选项只定义了两个变量。值0x03有何意义?Q1>是。当您似乎需要位掩码时,您正在使用枚举 你是对的,这毫无意义。使用枚举意味着变量all将等于选项中的一个项,而不是多个项的or组合。除了一些语法问题之外,您的代码确实有效

给定以下代码:

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

Options all = (Options) ( Surf | Out);
  • 这个铸件有问题吗
  • 如果这个角色有意义,那为什么呢

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

    Q1>是。当您似乎需要位掩码时,您正在使用枚举


    你是对的,这毫无意义。使用枚举意味着变量all将等于选项中的一个项,而不是多个项的or组合。

    除了一些语法问题之外,您的代码确实有效。 但它有点俗气。枚举是整数,但就样式而言,您应该坚持使用枚举中实际存在的值

    可能对按位集合使用不同的int我想,小心分配2的幂。如果您真的想要按位设置

    typedef enum Options
    {
    Surf     = 0x01,
    Out      = 0x02
    } Options;
    
    这个铸件有问题吗

    没有

    如果这个角色有意义,那为什么呢?根据我的理解,选项只定义了两个变量,值0x03有什么意义

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

    简言之:是的,对这样的位字段使用枚举是有效且定义良好的

    在回答这个问题时,允许在C++标准(C++ 03 7.2/6)中找到的形式语言:

    对于emin为最小枚举数且emax为最大值的枚举,枚举的值是范围bmin到bmax内的基础类型的值,其中bmin和bmax分别是可存储emin和emax的最小位字段的最小值和最大值

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

    关于这是否是一种好的风格,有一些争论。当然,可以说,通常假设枚举对象只能存储其中一个枚举数,因此这样的代码可能会令人困惑,并且容易出错


    另一方面,我认为当一个枚举打算用作位字段时,这通常是非常明显的。通常,此类枚举使用
    选项
    标志
    后缀或类似名称命名。同样,如果每个枚举数都有一个明显为单个集合位的集合值,则该枚举可能用作位字段。

    枚举只是int值的占位符,因此当按位或按位计算时,您会得到以下结果:二进制(4位表示,这样对我来说更容易):
    0001 | 0010=0011或3。枚举可以是任何值,甚至是完全无效的值。

    您可以将任意整数值赋给
    enum
    类型变量,但它的样式不好。一如既往,代码的可读性是第一位的,编译器是第二位的。我们期望枚举变量只包含有效的枚举常量

    我想把最后一行改为:

    int all = ( Surf | Out); 
    

    当然,C++枚举完全是跛脚的,所以当他们被滥用时,这并不奇怪。“戴维,这就是为什么我们在C++0x中幸运地拥有<代码> EnUM类< /C++ >。代码>或类似的东西。@ 2011,戴维在C++中达到了接近成熟的程度。@:我对C++的缓慢进化并不感到惊讶。它发展缓慢,因为它是有效的。优先级#1是使其仍能工作,而不是破坏兼容性,优先级#2是开发新功能并将其设计好,并在出现之前获得编译器制造商和目标程序员的反馈,因此开发速度很慢。仅供参考:
    0x02
    后面有一个额外的分号,而
    0x01
    后面需要一个逗号。我已经根据您的建议更正了代码——谢谢。唯一的问题(除了语法错误)是C-Cast的使用。@gravitron:这不是意见问题。C++中的Enums是专门设计来支持该操作的,它是安全的,它是标准的,也是一个既定的习惯用法。没有什么不同意的。@gravitron:你强烈反对的理由是什么?风格技术正确性?这是否是一个好的风格是有争议的(我倾向于认为它是完全可以接受的)。这在技术上是否正确还没有争议。。。我和gravitron在一起。我想这取决于“有效”和“有意义”的定义。这是一种风格上的呼吁,但我认为对于“代码的普通读者”来说,这是没有意义的。我希望枚举是枚举的一部分!(但它的行为是否符合语言定义?好的,是的。)真的吗?请提供来源。我是一个C程序员,而不是C++,谦逊地收回我的论点,如果这是真的。具体地说,我希望看到一个源代码,说明将变量定义为枚举类型是一种好的做法,该枚举类型存储的值不是所述枚举的成员。@gravitron:我已将引用添加到答案中。