Para determinar si se proporciona un tipo entero de ancho fijo, puede verificar si se ha definido una de las macros [U]INT*_MAXo 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 typedefnombre y definirá las macros asociadas . Por el contrario, para cada tipo descrito aquí que la implementación no proporciona, <stdint.h>no declarará ese typedefnombre 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_MACROSy qué __STDC_CONSTANT_MACROSsignifica? para detalles sobre __STDC_LIMIT_MACROS.
Por lo tanto, si int32_testá disponible, INT32_MAXy INT32_MINdebe ser #define'd. Por el contrario, si int32_tno está disponible, INT32_MAXtampoco INT32_MINse 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)