Чтобы определить, предоставляется ли целочисленный тип фиксированной ширины, вы можете проверить, определен ли соответствующий [U]INT*_MAXили [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
В соответствии с 7.20 целочисленных типов<stdint.h> , пункт 4 стандарта C11 (обратите внимание на выделенные жирным шрифтом части):
Для каждого типа, описанного в данном документе, который обеспечивает реализация, <stdint.h>следует объявить это typedefимя и определить связанные макросы . И наоборот, для каждого описанного здесь типа, который реализация не предоставляет, <stdint.h>не должно объявляться это typedefимя и не должно определяться связанный макрос .
C ++ наследует реализацию C через <cstdint>. Смотрите <cstdint>против<stdint.h> некоторых деталей. Также смотрите Что __STDC_LIMIT_MACROSи что __STDC_CONSTANT_MACROSзначит? для деталей о __STDC_LIMIT_MACROS.
Таким образом, если int32_tдоступно, INT32_MAXи INT32_MINдолжно быть #define'd. И наоборот, если int32_tнет в наличии, ни то, INT32_MAXни другое не INT32_MINможет быть #define'd.
Заметьте, однако, что, как @NicolBolas заявил в другом ответе , может быть, нет необходимости проверять.
#if defined(INT8_MIN)