Tworzę zestaw wartości wyliczenia, ale potrzebuję, aby każda wartość wyliczenia miała szerokość 64 bitów. Jeśli dobrze pamiętam, wyliczenie ma zazwyczaj taki sam rozmiar jak int; ale pomyślałem, że gdzieś przeczytałem, że (przynajmniej w GCC) kompilator może nadać wyliczeniu dowolną szerokość, jakiej potrzebują, aby zachować swoje wartości. Czy jest więc możliwe wyliczenie o szerokości 64 bitów?
140
Odpowiedzi:
enum
Jest gwarantowana tylko być na tyle duża, aby holdint
wartości. Kompilator może wybrać rzeczywisty typ używany na podstawie zdefiniowanych stałych wyliczania, dzięki czemu może wybrać mniejszy typ, jeśli może reprezentować zdefiniowane wartości. Jeśli potrzebujesz stałych wyliczania, które nie pasują do elementuint
, będziesz musiał użyć do tego rozszerzeń specyficznych dla kompilatora.źródło
enum
powinno być większe niżint
czy mniejsze? Po odpowiedzi @MichaelStum Twoje pierwsze zdanie powinno brzmieć „enum
Gwarantowane jest tylko dopasowanie doint
wartości”.int
. Odpowiedź Michaela Stuma , która odwołuje się do C99, mówi, że wyliczenie może być tak małe jakchar
.enum
Jest gwarantowana tylko być na tyle duże, aby utrzymać wartość największego wyliczający w enum.Zaczerpnięte z aktualnego standardu C (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Nie żeby kompilatory były dobre w podążaniu za standardem, ale zasadniczo: jeśli twoje wyliczenie zawiera coś innego niż int, jesteś w głębokim „nieobsługiwanym zachowaniu, które może powrócić i gryźć cię za rok lub dwa”.
źródło
int
short
long
int
, rzeczywista zmienna wyliczenia może być innego typu. Jest to dobrze znana niespójność w standardzie.enum my_enum { my_value }
,my_value
będzie miał typint
, aleenum my_enum
może mieć typ zdefiniowany w implementacji, który musi przynajmniej reprezentować wszystkie wartości wyliczenia. Więcmy_value
może mieć zawężoną konwersję doenum my_enum
, ale gwarantuje, że nie przepełni.Chociaż poprzednie odpowiedzi są poprawne, niektóre kompilatory mają opcje przełamania standardu i użycia najmniejszego typu, który będzie zawierał wszystkie wartości.
Przykład z GCC (dokumentacja w podręczniku GCC ):
źródło
Po prostu ustaw ostatnią wartość wyliczenia na wartość dostatecznie dużą, aby uzyskać rozmiar, jaki ma mieć wyliczenie, powinien wtedy mieć ten rozmiar:
źródło
Nie mamy kontroli nad wielkością
enum
zmiennej. Zależy to całkowicie od implementacji, a kompilator daje możliwość przechowywania nazwy dla liczby całkowitej przy użyciuenum
, więcenum
śledzi rozmiar liczby całkowitej.źródło
W języku C
enum
gwarantowany jest rozmiar anint
. Istnieje opcja czasu kompilacji (-fshort-enums
), aby uczynić go tak krótkim (jest to przydatne głównie w przypadku, gdy wartości nie są większe niż 64K). Nie ma opcji czasu kompilacji, aby zwiększyć jego rozmiar do 64 bitów.źródło
Rozważ ten kod:
Daje 4 jako wyjście. Więc bez względu na liczbę elementów, które
enum
zawiera, jego rozmiar jest zawsze stały.źródło