280 votes

Comment définir un type énuméré (enum) en C?

Je ne suis pas sûr de la syntaxe appropriée pour utiliser C enums. J'ai le code suivant:

 enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
 

Mais cela ne compile pas, avec l'erreur suivante:

 error: conflicting types for ‘strategy'
error: previous declaration of ‘strategy' was here
 

Qu'est-ce que je fais mal?

454voto

Il est intéressant de souligner que vous n'avez pas besoin d' un typedef. Il vous suffit de faire comme suit

enum strategy { RANDOM, IMMEDIATE, SEARCH };
enum strategy my_strategy = IMMEDIATE;

C'est une question de style que vous préférez, typedef. Sans elle, si vous voulez faire référence à l'énumération de type, vous devez utiliser enum strategy. Avec elle, vous pouvez juste dire strategy.

Deux méthodes ont leurs pro et les inconvénients. L'un est plus verbeux, mais conserve le type identifiants dans le tag de l'espace de noms où ils n'entrent pas en conflit avec un identifiant ordinaire ( struct stat et de la stat fonction: ce n'est pas le conflit), et où vous voyez immédiatement que c'est un type. L'autre est plus courte, mais apporte identifiants du type ordinaire de l'espace de noms.

392voto

RichieHindle Points 98544

Vous devez utiliser typedef comme ceci:

 typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy my_strategy = IMMEDIATE;
 

Avoir une convention de nommage pour distinguer les types et les variables est une bonne idée:

 typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_t;
strategy_t my_strategy = IMMEDIATE;
 

60voto

Tarc Points 318

Vous essayez de déclarer strategy deux fois, c'est pourquoi vous êtes obtenir l'erreur ci-dessus. Les ouvrages suivants, sans se plaint (compilé avec gcc -ansi -pendantic -Wall):

#include <stdio.h>

enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;

int main(int argc, char** argv){
    printf("strategy: %d\n", strategy); 

    return 0;
}

Si, au lieu de ce qui précède, le deuxième ligne a été modifié pour la:

...
enum { RANDOM, IMMEDIATE, SEARCH } strategy;
strategy = IMMEDIATE;
...

depuis les mises en garde vous pouvez facilement voir votre erreur:

enums.c:5:1: warning: data definition has no type or storage class [enabled by default]
enums.c:5:1: warning: type defaults to ‘int' in declaration of ‘strategy' [-Wimplicit-int]
enums.c:5:1: error: conflicting types for ‘strategy'
enums.c:4:36: note: previous declaration of ‘strategy' was here

Ainsi, le compilateur a fallu strategy = IMMEDIATE pour une déclaration d'une variable nommée strategy avec le type par défaut int, mais il y avait déjà une précédente déclaration d'une variable de ce nom.

11voto

Roddy Points 32503

Il vaut la peine de mentionner qu'en C ++ vous pouvez utiliser "enum" pour définir un nouveau type sans avoir besoin d'une instruction typedef.

 enum Strategy {RANDOM, IMMEDIATE, SEARCH};
...
Strategy myStrategy = IMMEDIATE;
 

Je trouve cette approche beaucoup plus amicale.

[modifier - statut C ++ clarifié - Je l'ai eu à l'origine, puis l'a supprimé!]

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