En C, une enum
constante est de type int
. En C++, c'est du type énuméré.
enum en_e{
en_e_foo,
en_e_bar=UINT64_MAX,
};
En C, c'est une violation de contrainte, nécessitant un diagnostic (si UINT64_MAX
dépasse INT_MAX
, ce qui très probablement n'). Un compilateur C peut rejeter le programme entièrement, ou il peut imprimer un avertissement, puis générer un exécutable dont le comportement est indéfini. (Il n'est pas 100% clair qu'un programme qui viole une contrainte a nécessairement un comportement indéfini, mais dans ce cas, le standard ne veut pas dire que le comportement est, donc c'est toujours un comportement non défini.)
gcc 6.2 ne pas vous avertir. clang. C'est un bug de gcc; il inhibe de façon incorrecte certains messages de diagnostic en utilisant des macros à partir des en-têtes standard sont utilisés. Grâce à Grzegorz Szpetkowski pour localiser le rapport de bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71613
En C++, chaque type d'énumération est un type sous-jacent, qui est un certain type entier (pas nécessairement int
). Ce type sous-jacent doit être capable de représenter toutes les valeurs de constante. Donc, dans ce cas, les deux en_e_foo
et en_e_bar
sont de type en_e
, qui doit être d'au moins 64 bits, même si int
est plus étroite.