W C enumstała jest typu int. W C ++ jest to typ wyliczeniowy.
enum en_e{
en_e_foo,
en_e_bar=UINT64_MAX,
};
W C jest to naruszenie ograniczenia , wymagające diagnostyki ( jeśli UINT64_MAX przekracza INT_MAX, co najprawdopodobniej tak się dzieje). Kompilator AC może całkowicie odrzucić program lub może wydrukować ostrzeżenie, a następnie wygenerować plik wykonywalny, którego zachowanie jest nieokreślone. (Nie jest w 100% jasne, że program, który narusza ograniczenie, musi koniecznie mieć nieokreślone zachowanie, ale w tym przypadku standard nie mówi, jakie to zachowanie, więc jest to nadal niezdefiniowane zachowanie.)
gcc 6.2 nie ostrzega o tym. brzęk robi. To jest błąd w gcc; niepoprawnie blokuje niektóre komunikaty diagnostyczne, gdy używane są makra ze standardowych nagłówków. Podziękowania dla Grzegorza Szpetkowskiego za zlokalizowanie raportu błędu: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71613
W C ++ każdy typ wyliczenia ma typ bazowy , który jest typem całkowitym (niekoniecznie int). Ten typ bazowy musi być w stanie reprezentować wszystkie wartości stałe. W tym przypadku oba typy en_e_fooi en_e_barsą typu en_e, który musi mieć co najmniej 64 bity szerokości, nawet jeśli intjest węższy.