¿Cómo definir un tipo enumerado (enum) en C?


Answers

Vale la pena señalar que no necesita un typedef . Puedes hacerlo como el siguiente

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

Es una pregunta de estilo si prefieres typedef . Sin él, si desea hacer referencia al tipo de enumeración, debe usar la enum strategy . Con eso, puedes decir strategy .

Ambas formas tienen sus pro y sus contras. El uno es más prolijo, pero mantiene los identificadores de tipo en el espacio de nombres de etiquetas donde no entrarán en conflicto con los identificadores ordinarios (piense en struct stat y la función stat : estos tampoco entran en conflicto), y donde inmediatamente ve que es un tipo. El otro es más corto, pero trae identificadores de tipo en el espacio de nombres ordinario.

Question

No estoy seguro de cuál es la sintaxis correcta para usar C enums. Tengo el siguiente código:

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

Pero esto no se compila, con el siguiente error:

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

¿Qué estoy haciendo mal?




@ThoAppelsin en su comentario a la pregunta publicada es correcto. El fragmento de código publicado en la pregunta es válido y sin errores. El error que tiene debe ser debido a otra sintaxis incorrecta en cualquier otro lugar de su archivo fuente c. enum{a,b,c}; define tres constantes simbólicas ( a , c ) que son números enteros con los valores 0 , 1 y 2 respectivamente, pero cuando usamos enum es porque normalmente no nos importa el valor entero específico, nos preocupamos más por el significado de el nombre de la constante simbólica. Esto significa que puedes tener esto:

#include <stdio.h>
enum {a,b,c};
int main(){
  printf("%d\n",b);
  return 0;
}

y esto generará 1 .

Esto también será válido:

#include <stdio.h>
enum {a,b,c};
int bb=b;
int main(){
  printf("%d\n",bb);
  return 0;
}

y saldrá igual que antes.

Si haces esto:

enum {a,b,c};
enum {a,b,c};

tendrá un error, pero si hace esto:

enum alfa{a,b,c};
enum alfa;

no tendrás ningún error

Puedes hacerlo:

enum {a,b,c};
int aa=a;

y aa será una variable entera con valor 0 . pero también puedes hacer esto:

enum {a,b,c} aa= a;

y tendrá el mismo efecto (es decir, aa es un int con valor 0 ).

también puedes hacer esto:

enum {a,b,c} aa= a;
aa= 7;

y aa será int con valor 7 .

Debido a que no puede repetir la definición de constante simbólica con el uso de enum , como he dicho anteriormente, debe usar etiquetas si desea declarar int vars con el uso de enum :

enum tag1 {a,b,c};
enum tag1 var1= a;
enum tag1 var2= b;

el uso de typedef es para enum tag1 escribir cada vez enum tag1 para definir la variable. Con typedef puedes simplemente escribir Tag1 :

typedef enum {a,b,c} Tag1;
Tag1 var1= a;
Tag1 var2= b;

También puede tener:

typedef enum tag1{a,b,c}Tag1;
Tag1 var1= a;
enum tag1 var2= b;

Lo último que se debe decir es que, como estamos hablando de constantes simbólicas definidas, es mejor usar letras mayúsculas cuando se utiliza enum , es decir, por ejemplo:

enum {A,B,C};

en lugar de

enum {a,b,c};



Mi construcción favorita y única siempre fue:

typedef enum MyBestEnum { / * suficientemente bueno * / GOOD = 0, /* even better */ BETTER, /* divine */ BEST };

Creo que esto eliminará tu problema que tienes.




Intenté con gcc y presenté mi necesidad, me vi obligado a usar la última alternativa, para compilar sin error.

estado de estado typedef enum {a = 0, b = 1, c = 2} state ;

typedef enum state {a = 0, b = 1, c = 2} state;

typedef enum state old; // New type, alias of the state type.
typedef enum state new; // New type, alias of the state type.

new now     = a;
old before  = b;

printf("State   now = %d \n", now);
printf("Sate before = %d \n\n", before);



Parece haber una confusión sobre la declaración.

Cuando la strategy es anterior a {RANDOM, IMMEDIATE, SEARCH} como se {RANDOM, IMMEDIATE, SEARCH} a continuación,

enum strategy {RANDOM, IMMEDIATE, SEARCH};

estás creando un nuevo tipo llamado enum strategy . Sin embargo, al declarar la variable, necesita usar la enum strategy . No puedes usar la strategy . Entonces el siguiente es inválido.

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

Mientras, lo siguiente es válido

enum strategy {RANDOM, IMMEDIATE, SEARCH};

enum strategy queen = RANDOM;
enum strategy king = SEARCH;
enum strategy pawn[100];

Cuando la strategy aparece después de {RANDOM, IMMEDIATE, SEARCH} , estás creando una enumeración anónima y luego declaras que la strategy es una variable de ese tipo.

Entonces, ahora puedes hacer algo como

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

Sin embargo, no puede declarar ninguna otra variable de tipo enum {RANDOM, IMMEDIATE, SEARCH} porque nunca la ha nombrado. Entonces el siguiente es inválido

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

Puedes combinar ambas definiciones también

enum strategy {RANDOM, IMMEDIATE, SEARCH} a, b;

a = RANDOM;
b = SEARCH;
enum strategy c = IMMEDIATE;

Typedef como se indicó anteriormente se usa para crear una declaración de variable más corta.

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;

Ahora le has dicho al compilador que enum {RANDOM, IMMEDIATE, SEARCH} es sinónimo de strategy . Entonces ahora puedes usar libremente la strategy como tipo de variable. Ya no necesita escribir enum strategy . Lo siguiente es válido ahora

strategy x = RANDOM;

También puede combinar Typedef junto con el nombre enum para obtener

typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;

No hay mucha ventaja de utilizar este método aparte del hecho de que ahora puede usar strategy y enum strategyName indistintamente.

typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;

enum strategyName a = RANDOM;
strategy b = SEARCH;



Cuando tu dices

enum {RANDOM, IMMEDIATE, SEARCH} strategy;

usted crea una sola variable de instancia, llamada 'estrategia' de una enumeración sin nombre. Esto no es algo muy útil de hacer, necesitas un typedef:

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





Links