type para libreria example enum c++ enums size types hex

para - enum type c++ example



¿Cuál es el tipo subyacente de una enumeración de c++? (4)

Esto puede haber sido respondido en otro lugar, pero no pude encontrar una respuesta adecuada.

Tengo este codigo

enum enumWizardPage { WP_NONE = 0x00, WP_CMDID = 0x01, WP_LEAGUES = 0x02, WP_TEAMS = 0x04, WP_COMP = 0x08, WP_DIVISIONS = 0x10, WP_FORMULAS = 0x20, WP_FINISHED = 0x40, };

Lo cual es heredado y tengo que modificarlo agregando algunos valores nuevos. El problema es que cada valor debe ser un bit único para que puedan ser O combinados en un mapa de bits.

Los valores se establecen utilizando el formato hexadecimal # x ##, pero me pregunto si este es el máximo que puede almacenar. ¿Cuál será el efecto, si lo hay, si cambio mi código a

enum enumWizardPage { WP_NONE = 0x0000, WP_CMDID = 0x0001, WP_LEAGUES = 0x0002, WP_TEAMS = 0x0004, WP_COMP = 0x0008, WP_DIVISIONS = 0x0010, WP_FORMULAS = 0x0020, WP_FINISHED = 0x0040, };


De la norma C ++ 7.2 / 5:

El tipo subyacente de una enumeración es un tipo integral que puede representar todos los valores del enumerador definidos en la enumeración. Está definido por la implementación qué tipo de integral se usa como el tipo subyacente para una enumeración, excepto que el tipo subyacente no debe ser mayor que int, a menos que el valor de un enumerador no se ajuste a un int o un int sin signo. Si la lista de enumeradores está vacía, el tipo subyacente es como si la enumeración tuviera un solo enumerador con valor 0. El valor de sizeof () aplicado a un tipo de enumeración, un objeto de tipo de enumeración o un enumerador, es el Valor de sizeof () aplicado al tipo subyacente.


El tipo de una enumeración de C ++ es la enumeración en sí misma. Su rango es bastante arbitrario, pero en términos prácticos, su tipo subyacente es un int .

Sin embargo, se int implícitamente en int dondequiera que se use.

C ++ 11 cambios

Esto ha cambiado desde C ++ 11, que introdujo enumerados escritos. Una enum tipo ahora se define como al menos el ancho de int (y más ancha si se necesitan valores más grandes). Sin embargo, dado un enum mecanografiado definido de la siguiente manera:

enum name : type {};

Una enumeración de name de tipo tiene un tipo de type subyacente. Por ejemplo, enum : char define una enum del mismo ancho que char lugar de int .

Además, una enum puede tener un alcance explícito de la siguiente manera:

enum class name : type { value = 0, // ... };

(Donde se requiere el name , pero el type es opcional). Una enum declarada de esta manera ya no se convertirá implícitamente a su tipo subyacente (que requiere un static_cast<> ) y los valores deben ser referenciados con un nombre completamente calificado. En este ejemplo, para asignar value a una variable de enum , debe referirse a ella como name::value .


El tipo subyacente es el entero con signo más pequeño que se ajusta al valor mayor / menor de su enumeración.


IIRC está representado como int en la memoria. Pero gcc tiene el -fshort-enum para convertirlo en un tipo entero más corto que se ajuste a todos los valores, si necesita ahorrar espacio. Otros compiladores tendrán algo similar.