Plusieurs raisons:
Raison 1: Flexibilité:
enum lickahoctor { yes = 0, no = 1, maybe = 2 };
déclare une énumération. Vous pouvez utiliser les valeurs yes
, no
et maybe
n'importe où et les affecter à n'importe quel type intégral. Vous pouvez également l'utiliser comme un type, en écrivant
enum lickahoctor myVar = yes;
Cela rend agréable parce que si une fonction prend un paramètre avec le ENUM de type lickahoctor vous saurez que vous pouvez affecter yes
, no
ou maybe
à elle. En outre, le débogueur le saura, il affichera donc le nom symbolique au lieu de la valeur numérique. Le problème est, le compilateur vous permettra seulement d'assigner les valeurs que vous avez définies dans enum lickahoctor
à myVar
. Si vous voulez par exemple définir quelques drapeaux dans la classe de base, ajoutez quelques drapeaux supplémentaires dans la sous-classe, vous ne pouvez pas le faire de cette façon.
Si vous utilisez un int à la place, vous n'avez pas ce problème. Donc vous voulez utiliser une sorte d'int, donc vous pouvez assigner des constantes arbitraires.
Raison n ° 2: la compatibilité binaire:
Le compilateur choisit une belle taille qui correspond à toutes les constantes que vous avez défini dans un ENUM. Il n'y a aucune garantie que vous obtiendrez. Donc, si vous écrivez une structure contenant une telle variable directement dans un fichier, il n'y a aucune garantie qu'elle sera toujours de la même taille lorsque vous la relirez avec la prochaine version de votre application (selon la norme C, au moins - - Ce n'est pas si sombre en pratique.
Si vous utilisez une sorte d'int à la place, la plate-forme garantit généralement une taille particulière pour ce nombre. Surtout si vous utilisez un des types garantis à une taille particulière, comme int32_t
/uint32_t
.
Raison n ° 3: Lisibilité et auto-documentation
Lorsque vous déclarez maVar ci-dessus, il est immédiatement évident que les valeurs que vous pouvez mettre. Si vous utilisez simplement un int, ou un uint32_t
, ce n'est pas le cas. Alors qu'est-ce que vous faites est que vous utilisez
enum { yes, no, maybe };
typedef uint32_t lickahoctor;
pour définir un joli nom pour l'entier quelque part près des constantes qui rappelleront les gens qu'une variable de ce type peut contenir cette valeur. Mais vous bénéficiez toujours d'une taille fixe prévisible et de la possibilité de définir des valeurs supplémentaires dans les sous-classes, si nécessaire.
Raison 4: Soutien à bitfields
variables enum typé ne supportent que assignant exactement une valeur de leurs options. Donc, si vous essayez d'implémenter un champ de bits, vous ne pouvez pas le taper comme un champ de bits. En outre, vous devez utiliser des variables non signées pour éviter que l'extension de signe ne vous vienne.
typedef et enum sont très différents ... Je ne comprends pas vraiment votre question? Les enum sont utilisés pour configurer des collections de constantes entières nommées. typedef sont utilisés pour donner un nouveau nom à un type de données, souvent pour prendre en charge différentes architectures ... – t00ny