Является ли использование enum для целочисленных бит-ориентированных операций в C ++ надежным / безопасным? - PullRequest
4 голосов
/ 30 июня 2010

Рассмотрим следующий (упрощенный) код:

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;
}

Это надежная, безопасная и / или полезная практика?Или есть лучший способ достижения того, что я хочу сделать, кроме использования константных int вместо enum?Я бы действительно предпочел перечисления, но надежность кода важнее читабельности.

Ответы [ 4 ]

5 голосов
/ 30 июня 2010

Я не вижу ничего плохого в этом дизайне.

Однако имейте в виду, что типы enum могут содержать неопределенные значения. В зависимости от того, кто использует ваши функции, вы можете сначала проверить, является ли значение tsm допустимым значением перечисления.

Поскольку enums являются целочисленными значениями, можно сделать что-то вроде:

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

Однако делать это уродливо, и вы можете просто подумать, что это приведет к неопределенному поведению.

0 голосов
/ 03 июля 2010

Использование перечислений для представления битовых комбинаций, масок и флагов не всегда является хорошей идеей, потому что перечисления обычно переводят в знаковый целочисленный тип, в то время как для битовой операции беззнаковые типы почтивсегда предпочтительнее

0 голосов
/ 03 июля 2010

Смотри также Каков размер перечисления в C?

Для некоторых компиляторов (например, VC ++) можно использовать этот нестандартный спецификатор ширины:

enum eTestMode : unsigned __int32
{ 
    TM_BASIC        = 1,    // 1 << 0 
    TM_ADV_1        = 1 << 1, 
    TM_ADV_2        = 1 << 2 
}; 
0 голосов
/ 30 июня 2010

Нет проблем.Вы даже можете использовать переменную eTestMode (и определяет битовую манипуляцию для этого типа), поскольку в этом случае гарантированно хранятся все возможные значения.

...