2011-01-07 1 views
1

Je souhaite utiliser un bool pour basculer entre charger X et charger Y à partir d'un fichier. Je ne veux pas utiliser "true" et "false", car cela ne rend pas le code clair. Je préfère utiliser quelque chose comme LOAD_X ou LOAD_Y ... Est-ce que le code suivant est le moyen de le faire? Ou y a-t-il un meilleur moyen?Définition de noms à la place de "true" et "false" pour le type booléen

#define LOAD_X true 
#define LOAD_Y false 

Edit: D'accord, il semble donc un enum est la voie à suivre ... mais ce que le schéma de nommage devrait être? Comme toutes les casquettes, ou minuscules pour le premier mot, en majuscules pour les mots suivants, etc.

+0

Attendez que quelqu'un arrive et écrit 'if (LOAD_Y)' ... –

+0

@Anon Pourquoi quelqu'un ferait-il cela? –

+0

@Tomalak: Probablement la même raison pour laquelle quelqu'un perdrait de la mémoire ou doublerait quelque chose. Le rendre facile à bousiller (et le rendre * vraiment très correct * quand il est foutu) est une chose terrible. –

Répondre

2

Je voudrais utiliser une énumération à la place. Juste parce qu'il y a deux choix, ne veut pas dire que le type devrait être booléen

enum load_type { loadX, loadY }; 
+0

Casquettes pour les constantes! –

+4

@Tomalak wtf. Caps pour les macros. Non-majuscules pour les non-macros. lol. –

+0

Si vous aimez les casquettes, allez-y. La bibliothèque standard ne les utilise pas pour les énumérations. –

5

Vous pouvez utiliser un ENUM:

enum LoadType { 
    LoadY, 
    LoadX 
}; 

Ou, vous pouvez préférer limiter la portée des agents recenseurs en utilisant un espace de noms:

namespace LoadType { 
    enum Type { 
     LoadY, 
     LoadX 
    }; 
}; 

l'avantage d'utiliser un ENUM est que si votre fonction prend un LoadType (ou un LoadType::Type dans le second exemple), vous ne pouvez pas passer tout entier arbitraire ou bool; vous ne pouvez lui passer que l'un des énumérateurs (ou quelque chose explicitement converti en type d'énumération, ce qui est vraiment facile à repérer dans une revue de code).

3

Je suppose que cela fonctionne, si vous n'avez jamais que deux options. Je serais tenté d'aller pour un ENUM:

enum LOADMODE { 
    LOAD_X, 
    LOAD_Y 
}; 

À tout le moins, préfèrent les constantes sur les macros:

const bool LOAD_X = true; 
const bool LOAD_Y = false; 

qu'ils respecteront les règles de portée et ne cassera pas en silence des choses sans vous se rendre compte quand les noms sont en conflit.

+0

J'apprécie trop énumer, mais au moins en C++ 98 je pense que j'irais avec les constantes, si seulement parce que les noms de valeur enum sont disponibles dans n'importe quel espace de noms dans l'enum.Heureusement, C++ 0x introduit le 'enum class' qui, entre autres choses, ne le fait pas, ce qui rend quelque chose comme' enum class load {X, Y}; 'possible avec' X' et 'Y' ne peut pas entrer en conflit avec n'importe quoi. – fow

+0

@fow: Vous pouvez facilement encapsuler une énumération dans un espace de noms ou une classe pour contraindre la portée des énumérateurs. –

+2

@fow Les constantes sont disponibles dans n'importe quel espace de nommage dans lequel elles sont définies. –

-1

Je pense que Load X IS LOAD. police minuscule look plus convivial, vous pouvez choisir des couleurs vives. enum LoadType { LoadY, LoadX tout va bien.

Questions connexes