2010-06-30 24 views
4

Consultez le code suivant (simplifié):Utilise enum pour les opérations sur les bits entiers en C++ fiable/sécurisé?

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

Est-ce fiable, sûr et/ou de bonnes pratiques? Ou y a-t-il une meilleure façon de réaliser ce que je veux faire en dehors de l'utilisation de const ints au lieu d'enum? Je préférerais vraiment des énumérations, mais la fiabilité du code est plus importante que la lisibilité.

Répondre

5

Je ne vois rien de mal dans cette conception. Cependant, gardez à l'esprit que les types enum peuvent contenir des valeurs non spécifiées. En fonction de qui utilise vos fonctions, vous pouvez vérifier d'abord que la valeur de tsm est une valeur d'énumération valide.

Depuis enums sont des valeurs entières, on pourrait faire quelque chose comme:

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

Cependant, ce fait est laid et vous pourriez considérer que celle-ci procure un comportement indéfini.

0

Il n'y a pas de problème. Vous pouvez même utiliser une variable de eTestMode (et définir la manipulation de bits pour ce type) car il est garanti que toutes les valeurs possibles sont conservées dans ce cas.

0

Voir aussi What is the size of an enum in C?

Pour certains compilateurs (par exemple VC++) ce spécificateur largeur non standard peut être utilisé:

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

En utilisant énumérations pour représenter motifs bits, des masques et des drapeaux ne sont pas toujours un bonne idée parce qu'enums généralement promouvoir à signé type entier, tandis que pour les opérations basées sur les bits non signé types sont presque toujours préférable.