45 votes

Différence entre les énoncés Enum et Define

Quelle est la différence entre l'utilisation d'une instruction define et d'une instruction enum en C / C ++? (et y a-t-il une différence en les utilisant avec C ou C ++?)

Par exemple, quand faut-il utiliser

 enum {BUFFER = 1234}; 
 

plus de

 #define BUFFER 1234   
 

Merci

57voto

Jason Cohen Points 36475

enum définit un élément syntaxique.

#define est une directive de pré-préprocesseur, exécutée avant que le compilateur voie le code, et n'est donc pas un élément de langage de C lui-même.

Généralement, les énumérations sont préférées car elles sont sécuritaires et plus faciles à détecter. Les définitions sont plus difficiles à localiser et peuvent avoir un comportement complexe. Par exemple, un morceau de code peut redéfinir un #define créé par un autre. Cela peut être difficile à localiser.

17voto

paxdiablo Points 341644

#define des déclarations sont traitées par le pré-processeur avant de le compilateur arrive à voir le code il est donc essentiel d'un texte de substitution (c'est en fait un peu plus intelligent grâce à l'utilisation de paramètres et tel).

Les énumérations sont une partie du langage C lui-même et avons les avantages suivants.

1/ Ils peuvent avoir le type et le compilateur peut type de vérification.

2/ Depuis qu'ils sont disponibles pour le compilateur, symbole des informations sur eux peut être passé à travers le débogueur, faire un débogage plus facile.

8voto

kiwi Points 519

définir une commande du préprocesseur, c'est comme faire de la "remplacer tout" dans votre éditeur, il peut remplacer une chaîne par une autre, puis compiler le résultat.

enum est un cas particulier de type, par exemple, si vous écrivez:

enum ERROR_TYPES
{
   REGULAR_ERR =1,
   OK =0
}

il existe un nouveau type appelé ERROR_TYPES. il est vrai que REGULAR_ERR rendements à 1, mais la conversion de ce type int doit produire un casting d'avertissement (si vous configurez vous êtes compilateur à haut niveau de verbosité).

résumé: ils sont à la fois semblables, mais lors de l'utilisation d'enum vous profitez de la vérification de type, et en utilisant définit il vous suffit de remplacer le code des chaînes de caractères.

5voto

Simon Buchan Points 6245

Les énumérations sont généralement préféré plus de #define, où il est logique d'utiliser un enum:

  • Débogueurs peut vous montrer le nom symbolique de l' enums valeur ("openType: OpenExisting", plutôt que "openType: 2"
  • Vous obtenez un peu plus de protection contre les collisions de noms, mais ce n'est pas aussi mauvaise qu'elle l'était (la plupart des compilateurs avertir à propos de re#definede la suisse.

La plus grande différence, c'est que vous pouvez utiliser les énumérations dans les catégories:

// Yeah, dumb example
enum OpenType {
    OpenExisting,
    OpenOrCreate,
    Truncate
};

void OpenFile(const char* filename, OpenType openType, int bufferSize);

Cela vous donne de la vérification de type de paramètres (vous ne pouvez pas mélanger les polices openType et bufferSize aussi facilement), et il est facile de trouver quelles sont les valeurs sont valides, ce qui rend vos interfaces beaucoup plus facile à utiliser. Certaines IDEs, peut même vous donner intellisense de complétion de code!

4voto

unwind Points 181987

Il est toujours préférable d'utiliser un enum si possible. L'utilisation d'une énumération donne au compilateur plus d'informations sur votre code source. Un compilateur préprocesseur défini n'est jamais vu par le compilateur et transporte donc moins d'informations.

Par exemple, pour implémenter un tas de modes, utiliser une énumération permet au compilateur d'attraper les informations manquantes: case dans un commutateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X