Вопрос

В 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top