2016-07-25 13 views
1

Ich habe nach immer vorbei an der 32. Flagge ein Problem mit meinem enum gegenüber:Lange Enum mit bitweise

enum ConditionType_t { 
    CONDITION_NONE       = 0, 
    CONDITION_LIGHT       = 1 << 0, 
    CONDITION_INFIGHT      = 1 << 1, 
    CONDITION_MUTED       = 1 << 2, 
    ... 
    CONDITION_LUCKY       = 1 << 32, 
} 

Zu wissen, dass enums sind im Grunde 8bit wird CONDITION_LUCKY zum CONDITION_NONE gleich sein. So implementiert ich C++11 ‚s enum classes:

enum class ConditionType_t : uint64_t { 
    CONDITION_NONE       = 0, 
    CONDITION_LIGHT       = 1 << 0, 
    CONDITION_INFIGHT      = 1 << 1, 
    CONDITION_MUTED       = 1 << 2, 
    ... 
    CONDITION_LUCKY       = 1 << 32, 
} 

Jetzt bekomme ich Millionen von Warnungen wie:

warning C4293: '<<' : shift count negative or too big, undefined behavior 

Und Fehler wie:

error C2065: 'CONDITION_NONE' : undeclared identifier 

Offenbar Bitverschiebung nicht zusammen bekommt mit enum classes.

Irgendwelche Gedanken?

+2

Was denken Sie macht, dass "' enums' sind grundsätzlich '8bit'"? – Dmitri

Antwort

4

Der Ausdruck 1 << 32 ist undefiniertes Verhalten. Von [expr.shift]: Wenn der rechte Operand

Das Verhalten ist negativ oder größer oder gleich der Länge in Bits der beworbenen linken Operanden undefiniert ist.

Da 1 ein int ist, hat es nur 32 Bits. Selbst wenn dies nicht undefiniert wäre, würden Sie auch nicht den gewünschten Wert erhalten, da der Typ 1 << 32int ist, der sowieso keinen 33-Bit-Wert halten kann.

Sie benötigen einen uint64_t von Anfang an verwenden:

enum class ConditionType_t : uint64_t { 
    CONDITION_NONE       = 0, 
    CONDITION_LIGHT       = 1ULL << 0, 
    CONDITION_INFIGHT      = 1ULL << 1, 
    CONDITION_MUTED       = 1ULL << 2, 
    ... 
    CONDITION_LUCKY       = 1ULL << 32, 
};