Есть ли аргумент для использования макросов числовых ограничений (например, INT64_MAX) по std:: numeric_limits? Из того, что я понимаю, numeric_limits находится в стандарте, но макросы находятся только на C99, поэтому поэтому нестандартные.
INT_ [MIN | MAX] предел макросов vs numeric_limits <T>
Ответ 1
Если С++, используйте numeric_limits
, конец.
EDIT: Хорошо, за комментарий Джеймса, а не "конец". - исключениями являются шаблоны и метки меток. Но я не вижу возможности использовать ярлык case для min или max или шаблон для них, но, я думаю, я не видел всех возможностей...
Я думаю, моя точка зрения заключается в том, что шаблон numeric_limits
более полезен за пределами max()
и min()
...
Ответ 2
Другие ответы содержат правильную информацию, но, похоже, для этого требуется обновление для С++ 11.
В С++ 11, std::numeric_limits<T>::min()
, std::numeric_limits<T>::max()
и std::numeric_limits<T>::lowest()
объявлены constexpr
, поэтому они могут использоваться в большинстве тех же контекстов, что и INT_MIN
и компании. Единственное исключение, о котором я могу думать, это строковая обработка времени компиляции с использованием токена строкой #
.
Это означает, что numeric_limits
можно использовать для ярлыков case, параметров шаблона и т.д., и вы получите преимущество использования его в общем коде (попробуйте использовать INT_MIN
vs. LONG_MIN
в template<typename T> get_min(T t);
).
С++ 11 также предлагает решение проблемы, о которой говорит Джеймс Канзе, добавив std::numeric_limits<T>::lowest()
, который дает наименьшее конечное значение для всех типов, а не самое низкое значение для целых типов и самое низкое положительное значение для плавающего типы точек.
Ответ 3
Pre С++ 0x, определенно. INT_MIN
и INT_MAX
являются интегральными постоянными выражениями; numeric_limits<int>::min()
и numeric_limits<int>::max()
- нет. <climits>
является стандартным С++, и если вы не имеете дело с шаблонами (где вы не знаете, есть ли это int
или long
), нет причин беспокоиться о чрезмерно сложном решении. (Также: если вы пишете шаблоны, не забывайте, что numeric_limits<int>::min()
и numeric_limits<double>::min()
представляют собой совершенно разные атрибуты: если вы хотите минимально возможное значение, вам понадобится numeric_limits<T>::is_integer ? numeric_limits<T>::min() : -numeric_limits<T>::max()
.)
Ответ 4
В определенных контекстах (например, case
метки, параметры шаблона непигового типа) ожидается числовая константа, а numeric_limits
не поддерживает это: numeric_limits<int>::max()
не является константой. В метках case
вы должны использовать INT_MAX
.
Это очень раздражает, но я слышу, что С++ 11 исправит это.