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.