代码之家  ›  专栏  ›  技术社区  ›  PeterK

使用EnUM用于C++中的整数位操作吗?

  •  4
  • PeterK  · 技术社区  · 15 年前

    考虑以下(简化)代码:

    enum eTestMode
    {
        TM_BASIC        = 1,    // 1 << 0
        TM_ADV_1        = 1 << 1,
        TM_ADV_2        = 1 << 2
    };
    
    ...
    
    int m_iTestMode;    // a "bit field"
    
    bool isSet( eTestMode tsm )
    { 
        return ( (m_iTestMode & tsm) == tsm );
    }
    
    void setTestMode( eTestMode tsm )
    {
        m_iTestMode |= tsm;
    }
    

    这是可靠、安全和/或良好的做法吗?或者,除了使用const int而不是enum之外,还有更好的方法来实现我想要做的事情吗?我非常喜欢枚举,但代码可靠性比可读性更重要。

    4 回复  |  直到 14 年前
        1
  •  5
  •   ereOn    15 年前

    我看不出那个设计有什么不好的地方。

    但是,请记住 enum 类型可以保存未指定的值。根据谁使用您的函数,您可能需要首先检查 tsm 是有效的枚举值。

    自从 enums 是整数值,可以这样做:

    eTestMode tsm = static_cast<eTestMode>(17); // We consider here that 17 is not a valid value for your enumeration.
    

    然而,这样做是丑陋的,您可能会认为这样做会导致未定义的行为。

        2
  •  0
  •   AProgrammer    15 年前

    没问题。甚至可以使用etestmode变量(并为该类型定义位操作),因为在这种情况下,它可以保证保存所有可能的值。

        3
  •  0
  •   Community CDub    8 年前

    也见 What is the size of an enum in C?

    对于某些编译器(例如VC++),可以使用此非标准宽度说明符:

    enum eTestMode : unsigned __int32
    { 
        TM_BASIC        = 1,    // 1 << 0 
        TM_ADV_1        = 1 << 1, 
        TM_ADV_2        = 1 << 2 
    }; 
    
        4
  •  0
  •   AnT stands with Russia    15 年前

    使用枚举来表示位模式、掩码和标志并不总是一个好主意,因为枚举通常提升为 签署 整数类型,而对于基于位的操作 未签名的 类型几乎总是可取的。