Para determinar si se proporciona un tipo entero de ancho fijo, puede verificar si se ha definido una de las macros [U]INT*_MAX
o la correspondiente [U]INT*_MIN
.
// 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
Según 7.20 tipos enteros<stdint.h>
, párrafo 4 del estándar C11 (tenga en cuenta las partes en negrita):
Para cada tipo descrito aquí que proporciona la implementación, <stdint.h>
declarará ese typedef
nombre y definirá las macros asociadas . Por el contrario, para cada tipo descrito aquí que la implementación no proporciona, <stdint.h>
no declarará ese typedef
nombre ni definirá las macros asociadas .
C ++ hereda la implementación de C a través de <cstdint>
. Ver <cstdint>
vs<stdint.h>
para algunos detalles. También vea ¿Qué significa __STDC_LIMIT_MACROS
y qué __STDC_CONSTANT_MACROS
significa? para detalles sobre __STDC_LIMIT_MACROS
.
Por lo tanto, si int32_t
está disponible, INT32_MAX
y INT32_MIN
debe ser #define
'd. Por el contrario, si int32_t
no está disponible, INT32_MAX
tampoco INT32_MIN
se les permitirá #define
'd.
Sin embargo, tenga en cuenta que, como dijo @NicolBolas en otra respuesta , puede que no sea necesario verificarlo.
#if defined(INT8_MIN)