繁体   English   中英

在C ++中使用enum进行整数位操作可靠/安全吗?

[英]Is using enum for integer bit oriented operations in C++ reliable/safe?

考虑以下(简化)代码:

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之外,还有更好的方法来实现我想要做的事情吗? 我更喜欢枚举,但代码可靠性比可读性更重要。

我在这个设计中看不出任何坏事。

但是,请记住, enum类型可以包含未指定的值。 根据谁使用您的函数,您可能希望首先检查tsm的值是否是有效的枚举值。

由于enums是整数值,因此可以执行以下操作:

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

但是,这样做很难看,您可能只是认为这样做会导致未定义的行为。

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

另请参见C中枚举的大小是多少?

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

enum eTestMode : unsigned __int32
{ 
    TM_BASIC        = 1,    // 1 << 0 
    TM_ADV_1        = 1 << 1, 
    TM_ADV_2        = 1 << 2 
};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM