Constantes ou enum() ?

Je me demande parfois quand il vaut mieux utiliser un enum() ou des constantes.
Exemple:
ou
pour transmettre des infos d'un contrôleur à un autre par exemple
ou
Exemple:
typedef enum {<br /> DisplayTypeList=0,<br /> DisplayTypeCellar,<br /> DisplayTypeGrid<br />} DisplayType;
ou
#define DISPLAY_TYPE_LIST 0<br />#define DISPLAY_TYPE_CELLAR 1<br />#define DISPLAY_TYPE_GRID 2
pour transmettre des infos d'un contrôleur à un autre par exemple
controller.displayType = DisplayTypeGrid;
ou
controller.displayType = DISPLAY_TYPE_GRID;
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Et en plus, elle t'évite des bêtises, comme utiliser deux fois un même index, ou ajouter un ; superflu à la fin du #define...
Vu que un énum est équivalent à un int, je peux aussi écrire des choses comme :
Dernière question:
est équivalent à :
On est d'accord ? On ne l'écrit pas pour aller plus vite?
C'est utile de les détailler surtout si tu veux faire des sauts entre les différentes valeurs d'enum pour pas qu'ils ne soient tous consécutifs, ce qui peut être utile en particulier si tes enums servent comme masques pour des flags (du coup pour pouvoir être combinés proprement il ne faut pas que les bits de la représentation binaire se chevauchent entre les valeurs, enfin ça dépend de ce que tu veux faire mais bon)
Ok !
On peut mettre ton pluriel en début de liste ?
Ok, j'ai cru à une convention de nommage avec le pluriel. Je fais trop de Rails.
C'est plus propre et moins ambigà¼e.
A quoi sert le _ASIAuthenticationType après le enum ?
Je rappelle (je l'avais déjà expliqué dans un autre thread je crois) que la syntaxe du typedef est : [tt]typedef {type détaillé} {alias pour le type}[/tt]
1) Un enum n'a pas forcément de nom. On peut tout à fait déclarer une variable de type enum sans donner de nom à l'enum :
Mais bien souvent c'est pas pratique car ce type on va le manipuler à plusieurs endroits dans le code on va déclarer des variables intermédiaires ou des paramètres de méthodes pour faire passer la valeur de valeurABC d'un bout du code à l'autre, donc on va devoir réutiliser le type qu'on a décrit via l'enum. Du coup on donne un nom à l'enum, c'est la syntaxe 2
2) Pour donner un nom quand on déclares l'enum, on utilise la syntaxe suivante : Ici tu déclares juste un enum, avec un nom (mais pas de typedef donc pas d'alias sur le "nom complet du type").
Du coup pour l'utiliser, tu es obligé d'utiliser le nom complet, y compris avec le mot clé "enum". Par exemple pour déclarer une variable avec ce type, tu es obligé de répéter le type complet, avec le mot clé "enum" comme ceci :
3) Du coup comme c'est chiant de répéter "enum" à chaque fois (et pareil pour les types "union" et "struct" c'est le mm problème), on fais en général un typedef :
Du coup avec cette syntaxe, on peut toujours utiliser le type complet "enum _ASIAuthenticationType", mais ou peut aussi utiliser son "alias" qu'on a défini avec typedef, et qu'on a appelé "ASIAuthenticationType" tout simplement. Plus facile à manipuler
4) Mais du coup, vu qu'on a défini un alias pour cet enum, on a plus forcément besoin de lui donner un nom pour son nom complet ! Donc du coup autant dans la déclaration du typedef laisser tomber le nom interne de l'enum, comme on a fait en (1), si on ne compte le manipuler qu'au travers de son alias qu'on donne via typedef ! Autrement dit on déclare juste un alias/nom court pour un type (via typedef) en disant que cet alias correspond à un enum... qui du coup est anonyme car n'a pas besoin de nom complet :
Bonjour,
Pour les constantes qui servent pour des test de branchements, je n'utilise jamais la valeur zéro pour éviter
une erreur dans le cas d'une variable non initialisée par exemple.
Hmm j'ai du mal à voir pourquoi.. Si par défaut tu souhaites utiliser un type Cellar, pourquoi ne pas mettre Cellar en premier et virer "Unknown". Tu n'aurais même pas besoin de faire "displayType = DisplayTypeCellar" dans le setup du controlView.
Oui en effet l'exemple du displayType (à vrai dire j'ai bêtement recopié le contenu de l'enum sans trop chercher à savoir à quoi ça correspondait en vrai, mais maintenant que tu le dis...) dans ce cas y'a pas d'intérêt.
C'est plutôt dans un cas genre que là ça a du sens.