2009-09-24 8 views
26

В C99 я включаю stdint.h, и это дает мне UINT32_MAX, а также uint32_t. Однако в C++ определяется UINT32_MAX. Я могу определить __STDC_LIMIT_MACROS перед включением stdint.h, но это не работает, если кто-то включает мой заголовок после того, как уже включил stdint.h.Что такое эквивалент C++ UINT32_MAX?

Итак, что такое стандартный способ определения максимального значения, представляемого в uint32_t?

+7

некромантов примечание стороны: '#include ' в C++ – AJG85

+0

@ AJG85 имеет правильный ответ. –

ответ

48

Ну, я не знаю о 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; 
+3

или если 'uint32_t' является' typedef' одного из указанных выше? –

+0

Я уверен, что это typedef. Если ваши инструменты используют '# define' для этого, я сомневаюсь в их качестве. – John

+0

Чтобы избежать numeric_limits :: min(), numeric_limits :: max() из путаницы с std :: min() и std :: max() Мне пришлось заключить его в круглые скобки, как это: (std :: numeric_limits ::Максимум)(); –

18

std::numeric_limits<T>::max() определяет максимальное значение для типа T.

20

Ну, uint32_t всегда будет 32 бит, и всегда без знака, так что вы можете безопасно определить вручную:

#define UINT32_MAX (0xffffffff) 

Вы также можете сделать

#define UINT32_MAX ((uint32_t)-1) 
+20

Нам не нужно прибегать к этому, когда у нас есть вполне допустимые стандартные конструкции C++, которые используют только в 3 раза больше символов. – John

+1

@John: Это совершенно стандартное и портативное устройство. –

+0

И стандартные библиотеки могут быть не всегда доступны - для кода модуля ядра, например. ... – mtahmed

1

Вы можете быть в состоянии устранить #include проблемы порядка, изменяя процесс сборки, чтобы определить __STDC_LIMIT_MACROS символ в командной строке компилятора вместо:

cxx -D__STDC_LIMIT_MACROS ... 

Конечно, вы по-прежнему возникают проблемы, если заголовок #undef s этот символ.

Кроме того, авторы стандартной реализации библиотеки, которые вы используете, возможно, не предназначены для пользователей, чтобы установить этот конкретный символ; может быть флаг компилятора или другой символ, который пользователи должны использовать для включения типов C99 в C++.

1

Я не могу комментировать, поэтому вот мой вклад в ответ Глена и Лиора Когана.

Если вы используете статические переменные, вы столкнетесь с проблемой, что если вы присвоите постоянному значению внутри класса numeric_limits :: max(), это значение будет фактически установлено равным нулю из-за порядка инициализации (см. этот пост zero initialization and static initialization of local scope static variable)

Так что в этом случае он будет работать только с использованием ответа Лиора Когана.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan 
#define UINT32_MAX ((uint32_t)-1)