En C, una enum
constante es de tipo int
. En C ++, es del tipo enumerado.
enum en_e{
en_e_foo,
en_e_bar=UINT64_MAX,
};
En C, esto es una violación de la restricción , que requiere un diagnóstico ( si se UINT64_MAX
excede INT_MAX
, lo que muy probablemente lo haga). El compilador AC puede rechazar el programa por completo, o puede imprimir una advertencia y luego generar un ejecutable cuyo comportamiento no está definido. (No está 100% claro que un programa que viola una restricción necesariamente tenga un comportamiento indefinido, pero en este caso el estándar no dice cuál es el comportamiento, por lo que sigue siendo un comportamiento indefinido).
gcc 6.2 no advierte sobre esto. clang lo hace. Este es un error en gcc; inhibe incorrectamente algunos mensajes de diagnóstico cuando se utilizan macros de encabezados estándar. Gracias a Grzegorz Szpetkowski por localizar el informe de error: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71613
En C ++, cada tipo de enumeración tiene un tipo subyacente , que es un tipo entero (no necesariamente int
). Este tipo subyacente debe poder representar todos los valores constantes. Entonces, en este caso, ambos en_e_foo
y en_e_bar
son del tipo en_e
, que debe tener al menos 64 bits de ancho, incluso si int
es más estrecho.