Jika Anda ingin menggunakan Qt , Anda harus merangkul quint8
, quint16
dan lain sebagainya.
Kalau mau pakai GLib harus diterima guint8
, guint16
dan lain sebagainya.
Di Linux ada u32
, s16
dan lain sebagainya.
Definisi UC / OSSINT32
, UINT16
dan sebagainya.
Dan jika Anda harus menggunakan beberapa kombinasi dari hal-hal itu, lebih baik Anda bersiap untuk masalah. Karena pada mesin Anda u32
akan typedef
selesai long
dan quint32
akan typedef
selesai int
dan compiler akan mengeluh .
Mengapa setiap orang melakukan ini, jika ada <stdint.h>
? Apakah ini semacam tradisi untuk perpustakaan?
stdint.h
ditemukan.sizeof(int) * CHAR_BIT
(misalnya) dan menggunakan itu? Jika Andaint
terlalu kecil untuk mewakili rentang Anda (misalnya indeks array), maka Anda hampir pasti tidak boleh menggunakannyaint
, tetapi sesuatu sepertisize_t
. Mengapaint32
lebih masuk akal? Satu-satunya waktu dengan lebar tetap yang masuk akal adalah untuk komunikasi antar sistem (misalnya format file / jaringan) ...uint16_t
(atau mungkinfast
atauleast
variannya). Maksud saya adalah: Jenis ini nyaman digunakan dan memiliki alasan keberadaannya.size_t
dan / atauuint64_t
.Jawaban:
stdint.h
tidak ada kembali saat perpustakaan ini dikembangkan. Jadi setiap perpustakaan membuat sendiritypedef
.sumber
Untuk pustaka yang lebih lama, ini diperlukan karena header yang dimaksud (
stdint.h
) tidak ada.Namun, masih ada masalah di sekitar: tipe tersebut (
uint64_t
dan lainnya) adalah fitur opsional dalam standar. Jadi implementasi yang sesuai mungkin tidak disertakan bersama mereka - dan dengan demikian memaksa perpustakaan untuk tetap menyertakannya saat ini.sumber
uintN_t
jenis adalah opsional, tetapiuint_leastN_t
danuint_fastN_t
jenis tidak.stdint.h
telah distandarisasi sejak 1999. Tampaknya banyak aplikasi yang mendefinisikan (alias secara efektif) jenis untuk mempertahankan independensi parsial dari arsitektur mesin yang mendasarinya.Mereka memberikan keyakinan kepada pengembang bahwa tipe yang digunakan dalam aplikasi mereka cocok dengan asumsi spesifik proyek mereka pada perilaku yang mungkin tidak cocok dengan standar bahasa atau implementasi compiler.
Praktik ini dicerminkan dalam pola desain Façade berorientasi objek dan banyak disalahgunakan oleh pengembang yang selalu menulis kelas pembungkus untuk semua perpustakaan yang diimpor.
Ketika compliers jauh lebih sedikit standarnya dan arsitektur mesin dapat bervariasi dari 16-bit, 18-bit hingga 36-bit word length mainframe, ini lebih menjadi pertimbangan. Praktik ini jauh lebih tidak relevan sekarang di dunia yang berkumpul pada sistem tertanam ARM 32-bit. Ini tetap menjadi perhatian bagi mikrokontroler kelas bawah dengan peta memori yang aneh .
sumber
stdint.h
telah distandarisasi sejak 1999, tetapi sudah berapa lama dalam praktiknya? Orang-orang berlarut-larut dalam menerapkan dan mengadopsi standar baru, dan selama masa transisi yang panjang itu, metode lama masih merupakan suatu keharusan.stdint.h
adalah bahwa bahkan pada platform di mana misalnyalong
danint32_t
memiliki ukuran dan representasi yang sama, tidak ada persyaratan bahwa mentransmisikanint32_t*
kelong*
akan menghasilkan penunjuk yang dapat diandalkan mengakses aint32_t
. Saya tidak percaya penulis Standar berpikir dengan jelas bahwa jenis yang kompatibel dengan tata letak harus kompatibel dengan alias, tetapi karena mereka tidak repot-repot mengatakannya sehingga penulis gcc dan IIRC dentang berpikir bahasanya akan ditingkatkan dengan mengabaikan aliasing bahkan dalam kasus di mana sudah jelas.-fno-strict-alias
, tetapi yang sebenarnya masih berfungsi. Bahkan jika tidak ada basis kode yang ada, tidak ada satu set aturan yang dapat mencapai keseimbangan optimal pengoptimalan dan semantik untuk semua aplikasi, karena aplikasi yang berbeda memiliki kebutuhan yang berbeda. Tambahkan basis kode yang ada dan kebutuhan akan mode yang berbeda harus jelas.Jadi Anda memiliki kekuatan untuk mengetikkan char to int.
Satu "koding horor" menyebutkan bahwa salah satu header perusahaan memiliki titik di mana seorang programmer menginginkan nilai boolean, dan karakter adalah tipe asli logis untuk pekerjaan tersebut, dan begitu juga menulis
typedef bool char
. Kemudian kemudian seseorang menemukan bilangan bulat menjadi pilihan paling logis, dan menulistypedef bool int
. Hasilnya, jauh sebelum Unicode, secara virtualtypedef char int
.Cukup banyak pemikiran ke depan, kompatibilitas ke depan, menurut saya.
sumber