Saya membuat satu set nilai enum, tetapi saya membutuhkan masing-masing nilai enum selebar 64 bit. Jika saya ingat dengan benar, enum umumnya berukuran sama dengan int; tapi saya pikir saya membaca di suatu tempat bahwa (setidaknya di GCC) kompiler dapat membuat enum lebar yang mereka butuhkan untuk memegang nilai-nilai mereka. Jadi, apakah mungkin untuk memiliki enum yang lebar 64 bit?
140
Jawaban:
An
enum
hanya dijamin cukup besar untuk menampungint
nilai. Kompiler bebas memilih tipe aktual yang digunakan berdasarkan konstanta enumerasi yang ditentukan sehingga dapat memilih tipe yang lebih kecil jika dapat mewakili nilai yang Anda tetapkan. Jika Anda membutuhkan konstanta enumerasi yang tidak sesuai denganint
Anda, Anda perlu menggunakan ekstensi khusus kompiler untuk melakukannya.sumber
enum
harus lebih besar dariint
atau lebih kecil? Mengikuti jawaban @MichaelStum, kalimat pertama Anda seharusnya "Sebuahenum
hanya dijamin sesuai denganint
nilai."int
. Jawaban Michael Stum , yang merujuk C99, mengatakan bahwa enum mungkin sekecil achar
.enum
hanya dijamin akan cukup besar untuk menampung nilai pencacah terbesar di enum.Diambil dari Standar C saat ini (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Bukan berarti kompiler pandai mengikuti standar, tetapi pada dasarnya: Jika enum Anda memegang sesuatu selain int, Anda berada dalam "perilaku yang tidak didukung yang mungkin kembali menggigit Anda dalam satu atau dua tahun" wilayah.
sumber
int
.short
danlong
juga tipe integer, dan apa pun implementasi yang dipilih, semua nilai harus cocok (" harus mampu mewakili nilai semua anggota enumerasi").int
, variabel enumerasi yang sebenarnya bisa menjadi tipe lain. Ini adalah inkonsistensi yang terkenal dalam standar.enum my_enum { my_value }
,my_value
akan memiliki tipeint
, tetapienum my_enum
dapat memiliki tipe implementasi yang ditetapkan yang setidaknya harus mewakili semua nilai enumerasi. Jadimy_value
mungkin ada konversi yang menyempitenum my_enum
, tetapi dijamin tidak meluap.Sementara jawaban sebelumnya benar, beberapa kompiler memiliki opsi untuk memecah standar dan menggunakan tipe terkecil yang akan berisi semua nilai.
Contoh dengan GCC (dokumentasi dalam Manual GCC ):
sumber
Cukup atur nilai terakhir dari enum ke nilai yang cukup besar untuk menjadikannya ukuran yang Anda inginkan dari enum, maka ukurannya harus sebesar itu:
sumber
Kami tidak memiliki kendali atas ukuran suatu
enum
variabel. Ini benar-benar tergantung pada implementasinya, dan kompiler memberikan opsi untuk menyimpan nama untuk integer menggunakanenum
, demikianenum
juga mengikuti ukuran integer.sumber
Dalam bahasa C, suatu
enum
ukuran dijamin dari suatuint
. Ada opsi waktu kompilasi (-fshort-enums
) untuk membuatnya singkat (Ini terutama berguna jika nilainya tidak lebih dari 64K). Tidak ada opsi waktu kompilasi untuk meningkatkan ukurannya menjadi 64 bit.sumber
Pertimbangkan kode ini:
Ini akan memberikan 4 sebagai output. Jadi, berapa pun jumlah elemen dan isi
enum
, ukurannya selalu tetap.sumber