¿Qué significa esta enumeración?

Vi esta línea de código hoy y no tenía idea de lo que hace.

typedef enum { SomeOptionKeys = 1 << 0 // ? } SomeOption; 

Algún uso o ejemplo sería útil. ¡Gracias!

Parece que define un tipo enumerado que se supone que contiene un conjunto de indicadores. Esperarías ver más de ellos definidos, así:

 typedef enum { FirstOption = 1 << 0, SecondOption = 1 << 1, ThirdOption = 1 << 2 } SomeOption; 

Como se definen como potencias de dos, cada valor corresponde a un solo bit en una variable entera. Por lo tanto, puede utilizar los operadores bitwise para combinarlos y probar si están configurados. Este es un patrón común en el código C

Podrías escribir código como este que los combine:

 SomeOption myOptions = FirstOption | ThirdOption; 

Y puedes comprobar qué opciones están configuradas de esta manera:

 if (myOptions & ThirdOption) { ... } 

El valor de SomeOptionKeys es uno, esta es una representación útil cuando se trabaja con indicadores:

 typedef enum { flag1 = 1 << 0, // binary 00000000000000000000000000000001 flag2 = 1 << 1, // binary 00000000000000000000000000000010 flag3 = 1 << 2, // binary 00000000000000000000000000000100 flag4 = 1 << 3, // binary 00000000000000000000000000001000 flag5 = 1 << 4, // binary 00000000000000000000000000010000 // ... } SomeOption; 

De esta forma, cada indicador tiene solo un bit establecido, y podrían representarse en un bitmap.

Editar:

Aunque, debo decir, es posible que me esté perdiendo algo, pero me parece redundante usar enumeraciones para eso. Ya que pierde cualquier ventaja de las enumeraciones en esta configuración, también puede usar #define :

 #define flag1 (1<<0) #define flag2 (1<<1) #define flag3 (1<<2) #define flag4 (1<<3) #define flag5 (1<<4) 

Simplemente establece la enumeración en el valor 1. Probablemente está destinado a indicar que los valores deben ser potencias de 2. La siguiente podría asignarse 1 << 1 , etc.

<< es el operador de cambio a la izquierda. En general, esto se utiliza cuando desea que sus enumeraciones enmascaren un solo bit. En este caso, el cambio no hace nada, ya que es 0, pero es posible que aparezca en casos más complejos.

Un ejemplo podría ser:

 typedef enum { OptionKeyA = 1<<0, OptionKeyB = 1<<1, OptionKeyC = 1<<2, } OptionKeys; 

Luego, si tenía alguna función que tomó una clave de opción, podría usar la enumeración como una máscara de bits para verificar si una opción está establecida.

 int ASet( OptionKeys x){ return (x & OptionKeyA); } 

O si tenía un bitmap de bandera y quería establecer una opción:

 myflags | OptionKeyB