studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones c enums

programacion - ¿Cuál es el tamaño de una enumeración en C?



manual de programacion android pdf (7)

Considerar:

enum value{a,b,c,d,e,f,g,h,i,j,l,m,n}; value s; cout << sizeof(s) << endl;

Esto dará el resultado como 4. Así que no importa el número de elementos que contenga una enumeración, su tamaño siempre es fijo.

Estoy creando un conjunto de valores enum, pero necesito que cada valor enum 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 necesitan para mantener sus valores. Entonces, ¿es posible tener una enumeración de 64 bits de ancho?


El tamaño de almacenamiento no está influenciado por la cantidad de valores en la enumeración. El tamaño de almacenamiento está definido por la implementación, pero principalmente es el tamaño de sizeof(int) .


En lenguaje C, se garantiza que una enum tendrá el tamaño de int. Hay una opción de tiempo de compilación ( -fshort-enums ) para que sea tan corta (Esto es principalmente útil en caso de que los valores no sean más de 64K). No hay opción de tiempo de compilación para aumentar su tamaño a 64 bits.


No tenemos control sobre el tamaño de una variable enum. Depende totalmente de la implementación, y el compilador da la opción de almacenar un nombre para un entero usando enum, por lo que enum sigue el tamaño de un entero.


Si bien las respuestas anteriores son correctas, algunos compiladores tienen opciones para romper el estándar y usar el tipo más pequeño que contendrá todos los valores.

Ejemplo con GCC :

enum ord __attribute__ ((__packed__)) { FIRST = 1, SECOND, THIRD, }; STATIC_ASSERT( sizeof(enum ord) == 1 )


Tomado del Estándar C actual (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 Especificadores de enumeración
[...]
Restricciones
La expresión que define el valor de una constante de enumeración debe ser una expresión constante constante que tiene un valor representable como int.
[...]
Cada tipo enumerado debe ser compatible con caracteres, un tipo entero con signo o un tipo entero sin signo. La elección del tipo está definida por la implementación, pero debe ser capaz de representar los valores de todos los miembros de la enumeración.

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 profundo "comportamiento no respaldado que puede volver a morderlo en un año o dos".


Una enum solo está garantizada para ser lo suficientemente grande como para contener valores int . El compilador puede elegir libremente 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 se ajustan a una int , tendrá que usar extensiones específicas del compilador para hacerlo.