Dalam C ++, integer lebar tetap didefinisikan sebagai opsional , tetapi saya tidak bisa menemukan cara yang disarankan untuk memeriksa apakah mereka benar-benar didefinisikan.
Apa yang akan menjadi cara portabel untuk memeriksa apakah integer lebar tetap tersedia?
#if defined(INT8_MIN)
cpp
file yang ditentukan dan tergantung pada apakah kompilasi gagal atau tidak makro yang dapat Anda tentukan diatur.AC_TYPE_INT8_T
dll.Jawaban:
Untuk menentukan apakah tipe integer lebar tetap disediakan, Anda dapat memeriksa apakah salah satu dari yang sesuai
[U]INT*_MAX
atau[U]INT*_MIN
makro didefinisikan.Per 7.20 Jenis integer
<stdint.h>
, paragraf 4 dari standar C11 (perhatikan bagian yang dicetak tebal):C ++ mewarisi implementasi C melalui
<cstdint>
. Lihat<cstdint>
vs<stdint.h>
untuk beberapa detail. Juga lihat Apa artinya__STDC_LIMIT_MACROS
dan__STDC_CONSTANT_MACROS
artinya? untuk detail tentang__STDC_LIMIT_MACROS
.Dengan demikian, jika
int32_t
tersedia,INT32_MAX
danINT32_MIN
harus#define
'd. Sebaliknya, jikaint32_t
tidak tersedia, keduanyaINT32_MAX
tidakINT32_MIN
diizinkan untuk menjadi#define
'd.Catat juga, seperti yang dikatakan @NicolBolas dalam jawaban lain , mungkin tidak perlu benar-benar memeriksa.
sumber
[U]INT*_C
bukannya makro min & maxINT64_C
didefinisikan jikaint64_least_t
tersedia, bukan jikaint64_t
tersedia. Lihat dokumentasiSecara garis besar ... Anda tidak.
Jika Anda perlu menggunakan tipe integer berukuran tetap, maka itu berarti Anda secara eksplisit membutuhkan tipe integer tersebut dari ukuran spesifiknya. Artinya, kode Anda tidak akan berfungsi jika Anda tidak bisa mendapatkan bilangan bulat dari ukuran itu. Jadi Anda harus menggunakannya; jika seseorang menggunakan kode Anda pada kompiler yang tidak memiliki tipe kata, maka kode Anda tidak akan dikompilasi. Tidak masalah, karena kode Anda tidak akan berfungsi jika dikompilasi.
Jika Anda tidak benar-benar membutuhkan bilangan bulat berukuran tetap tetapi hanya menginginkannya karena alasan lain, maka gunakan
int_least_*
tipenya. Jika implementasinya dapat memberi Anda ukuran yang tepat, makaleast_*
jenisnya akan memiliki ukuran itu.sumber
uint8_t
), tetapi kode ini entah bagaimana harus dijalankan pada platform di mana byte bukan 8 bit (yang, selain menggunakan implementasi C ++ lama, akan menjadi satu-satunya alasan mengapauint8_t
tidak tersedia)? Artinya, di luar kompatibilitas ke belakang, mengapa Anda perlu melakukan ini?uint8_t
adalah jauh lebih jelas daripada pendekatan sebelum ad-hoc (dan sering rusak).O(1)
versusO(n)
usaha. Alasan yang sama mengapa orang menggunakan misuint16_t
. Anda bertanya "mengapa tidak menggunakan uint32_t dan melemparkannya sendiri?", Yang jawabannya harus jelas.uint16_t
. Alasan saya adalah bahwa saya berkomunikasi dengan perangkat / format / etc yang mengharapkan untuk mendapatkan tepat 16 bit data yang diformat sebagai biner, integer unsigned menggunakan endian untuk mesin saya, dan jika saya tidak bisa mendapatkan tipe yang tepatnya itu, maka berkomunikasi secara efektif dengannya jauh lebih sulit. Program saya (dan API yang saya gunakan dengannya) pada dasarnya tidak dapat berfungsi pada mesin yang tidak menyediakannya.