Estoy creando un conjunto de valores de enumeración, pero necesito que cada valor de enumeración tenga 64 bits de ancho. Si recuerdo correctamente, una enumeración es generalmente del mismo tamaño que una int; pero pensé que leí en alguna parte que (al menos en GCC) el compilador puede hacer que la enumeración tenga el ancho que sea necesario para mantener sus valores. Entonces, ¿es posible tener una enumeración de 64 bits de ancho?
140

Respuestas:
Una
enumúnica se garantiza que sea lo suficientemente grande como para contenerintvalores. El compilador es libre de elegir el tipo real utilizado en función de las constantes de enumeración definidas para que pueda elegir un tipo más pequeño si puede representar los valores que defina. Si necesita constantes de enumeración que no encajan en unaint, deberá usar extensiones específicas del compilador para hacerlo.fuente
enumdebería ser mayor que unointo menor? Siguiendo la respuesta de @MichaelStum, su primera oración debería ser "Unenumsolo se garantiza que encaja en unintvalor".int. La respuesta de Michael Stum , que hace referencia a C99, dice que una enumeración puede ser tan pequeña como achar.enumúnica se garantiza que sea lo suficientemente grande como para mantener el valor de la mayor enumerador en la enumeración.Tomado del estándar C actual (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
No es que los compiladores sean buenos para seguir el estándar, pero esencialmente: si su enumeración contiene algo más que un int, está en un "comportamiento sin apoyo que puede volver a morderlo en un año o dos".
fuente
int.shortylongson tipos enteros también, y cualquiera que sea la implementación que elija, todos los valores deben ajustarse (" será capaz de representar los valores de todos los miembros de la enumeración").int, la variable de enumeración real podría ser de otro tipo. Esta es una inconsistencia bien conocida en el estándar.enum my_enum { my_value },my_valuetendrá tipoint, peroenum my_enumpuede tener un tipo definido de implementación que al menos debe representar todos los valores de enumeración. Pormy_valuelo tanto, puede tener una conversión de reducción aenum my_enum, pero se garantiza que no se desborde.Si bien las respuestas anteriores son correctas, algunos compiladores tienen opciones para romper el estándar y utilizar el tipo más pequeño que contendrá todos los valores.
Ejemplo con GCC (documentación en el Manual de GCC ):
fuente
Simplemente establezca el último valor de la enumeración en un valor lo suficientemente grande como para que sea del tamaño que desea que sea la enumeración, entonces debería ser ese tamaño:
fuente
No tenemos control sobre el tamaño de una
enumvariable. Depende totalmente de la implementación, y el compilador da la opción de almacenar un nombre para un número enteroenum, porenumlo que sigue el tamaño de un número entero.fuente
En lenguaje C,
enumse garantiza que an tendrá el tamaño de anint. Hay una opción de tiempo de compilación (-fshort-enums) para que sea breve (esto es principalmente útil en caso de que los valores no sean más de 64K). No hay una opción de tiempo de compilación para aumentar su tamaño a 64 bits.fuente
Considera este código:
Dará 4 como salida. Entonces, no importa la cantidad de elementos que
enumcontenga, su tamaño siempre es fijo.fuente