Чтобы определить, предоставляется ли целочисленный тип фиксированной ширины, вы можете проверить, определен ли соответствующий [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)