J'écris le portage du fichier-io ensemble de fonctions de c dans une classe C++. Les "nombres magiques" (constantes sans nom) abondent.Devrais-je utiliser un enum ou plusieurs const pour les constantes non-séquentielles en C++?
Les fonctions lisent un en-tête de fichier comportant un certain nombre d'entrées spécifiques dont les emplacements sont actuellement indiqués par des nombres magiques.
Un programmeur vétéran m'a enseigné il y a deux ans que l'utilisation de «nombres magiques» est intrinsèquement mauvaise, et j'ai donc essayé d'éviter d'utiliser des constantes sans nom dans mon port. Donc, je veux créer une sorte de liste de constantes d'où les entrées sont stockées. Jusqu'à présent, j'ai trouvé deux solutions qui semblent relativement sûres - utiliser un ensemble de constantes entouré d'un espace de noms ou une énumération en espace de noms. Puis-je utiliser l'une ou l'autre des solutions en toute sécurité? Y aurait-il des avantages à l'un par rapport à l'autre?
par exemple.
OPTION 1
namespace hdr_pos {
const unsigned int item_1_pos=4;
const unsigned int item_2_pos=8;
const unsigned int item_3_pos=12;
const unsigned int item_4_pos=24;
const unsigned int item_5_pos=32;
};
OPTION 2
namespace hdr_pos {
enum e {
item_1_pos=4,
item_2_pos=8,
item_3_pos=12,
item_4_pos=24,
item_5_pos=32
};
};
Y at-il de toute façon d'éviter les doublons, pour attraper si je change les positions en raison d'une future mise à jour l'en-tête de fichier, mais oublier changer l'un d'eux?
Veuillez garder ceci factuel et non-subjectif. S'il n'y a aucun avantage que vous connaissez, n'hésitez pas à répondre à cette question.
Note: J'utiliserais plus de noms descriptifs, bien sûr, dans mon implémentation actuelle; Je viens d'appeler les choses item_ < #> _... pour l'amour des exemples ...
Vous pouvez obtenir le compilateur pour vous assurer qu'il n'y a pas de valeurs d'énumérateur en double, mais c'est un battement et c'est un peu compliqué. [Vous pouvez voir ma réponse à cette autre question pour savoir comment faire] (http://stackoverflow.com/questions/2576868/cc-enums-detect-when-multiple-items-map-to-same-value/2577102 # 2577102). –
@James Wow c'est désordonné ... Je ne sais pas si ça en vaut la peine ici. Je veux dire que si vous vous trompez, le fichier ne sera pas analysé correctement, et vous le saurez assez rapidement, je suppose, après la compilation ... Merci, cependant, cela me donne un aperçu de ma dernière question là-bas. –
C'est compliqué si c'est la seule chose que vous utilisez pour générer la macro.J'ai écrit un ensemble de macros pour générer des fonctions ToString/ToEnum, des fonctions de vérification de plage et des opérateurs d'insertion et d'extraction de flux pour les énumérations; Si vous utilisez beaucoup d'énumérations, une macro comme celle-ci peut être très, très utile. –