Каков эквивалент UINT32_MAX на C ++ для UINT32_MAX?
Вопрос
В C99 я включаю stdint.h, и это дает мне UINT32_MAX, а также uint32_t .Однако в C ++ UINT32_MAX получает определение out .Я могу определить МАКРОСЫ __STDC_LIMIT_ перед включением stdint.h, но это не сработает, если кто-то включает мой заголовок после того, как уже включил stdint.h сам.
Итак, в C ++, каков стандартный способ определения максимального значения, представимого в uint32_t?
Решение
Ну, я не знаю насчет uint32_t
но для основных типов (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double
) вы должны использовать numeric_limits
шаблоны через #include <limits>
.
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
Если uint32_t
является #define
из одного из вышеперечисленных, чем этот код должен работать "из коробки"
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
Другие советы
std::numeric_limits<T>::max()
определяет максимальное значение для типа T
.
Ну, uint32_t всегда будет 32-разрядным и всегда без знака, так что вы можете безопасно определить его вручную:
#define UINT32_MAX (0xffffffff)
Вы также можете сделать
#define UINT32_MAX ((uint32_t)-1)
Возможно, вам удастся устранить #include
устраните проблемы, изменив процесс сборки, чтобы определить __STDC_LIMIT_MACROS
символ в командной строке компилятора вместо:
cxx -D__STDC_LIMIT_MACROS ...
Конечно, у вас все равно возникли бы проблемы, если бы заголовок #undef
это символ.
Кроме того, авторы реализации стандартной библиотеки, которую вы используете, возможно, не предполагали, что пользователи будут устанавливать этот конкретный символ;там может быть флаг компилятора или другой символ, который пользователи должны использовать для включения типов C99 в C ++.
Я не могу комментировать, поэтому вот мой вклад в ответ Глена против Лиора Когана.
Если вы используете статические переменные, вы столкнетесь с проблемой, заключающейся в том, что если вы присвоите постоянное значение внутри класса numeric_limits::max(), это значение фактически будет равно нулю из-за порядка инициализации (см. Этот пост нулевая инициализация и статическая инициализация статической переменной локальной области видимости)
Так что в этом случае это сработает только при использовании ответа Лиора Когана.
// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX ((uint32_t)-1)