4

考虑以下(简化的)代码:

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

4

4 回答 4

5

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

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

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

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

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

于 2010-06-30T12:07:15.630 回答
0

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

于 2010-06-30T12:05:21.740 回答
0

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

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

枚举 eTestMode : 无符号 __int32
{
    TM_BASIC = 1, // 1 << 0
    TM_ADV_1 = 1 << 1,
    TM_ADV_2 = 1 << 2
};
于 2010-07-03T06:09:09.457 回答
0

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

于 2010-07-03T06:28:12.160 回答