INT_ [MIN | MAX] предел макросов vs numeric_limits <T>

Есть ли аргумент для использования макросов числовых ограничений (например, INT64_MAX) по std:: numeric_limits? Из того, что я понимаю, numeric_limits находится в стандарте, но макросы находятся только на C99, поэтому поэтому нестандартные.

Ответ 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 исправит это.