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.
// may be necessary for your C++ implementation
#define __STDC_LIMIT_MACROS
#include <cstdint>
#ifdef INT32_MAX
// int32_t must be available to get here
int32_t some32bitIntVariable;
#endif
Per 7.20 Jenis integer<stdint.h>
, paragraf 4 dari standar C11 (perhatikan bagian yang dicetak tebal):
Untuk setiap jenis yang dijelaskan di sini yang disediakan oleh implementasi, <stdint.h>
harus menyatakan typedef
nama itu dan mendefinisikan makro terkait . Sebaliknya, untuk setiap jenis yang dijelaskan di sini bahwa implementasi tidak menyediakan, <stdint.h>
tidak boleh menyatakan typedef
nama itu atau mendefinisikan makro terkait .
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
dan INT32_MIN
harus #define
'd. Sebaliknya, jika int32_t
tidak tersedia, keduanya INT32_MAX
tidak INT32_MIN
diizinkan untuk menjadi #define
'd.
Catat juga, seperti yang dikatakan @NicolBolas dalam jawaban lain , mungkin tidak perlu benar-benar memeriksa.
#if defined(INT8_MIN)