Эквивалентность <limits>и <climits> - PullRequest
3 голосов
/ 17 марта 2009
  1. Гарантируется ли это всегда так:

    std::numeric_limits<int>::max() == INT_MAX
    

    Что стандарт C ++ говорит об этом? Я не смог найти в стандарте никаких ссылок, которые бы прямо указывали на это, но я продолжаю читать, что они должны быть эквивалентны.

  2. Как насчет типов C99, которые не соответствуют стандарту C ++ 98 для компиляторов, которые реализуют как C99 (как минимум long long part), так и C ++ 98? Я не уверен, есть ли какая-либо гарантия, что это всегда верно:

    std::numeric_limits<unsigned long long>::max() == ULLONG_MAX
    

    Это разумное предположение?

Ответы [ 4 ]

4 голосов
/ 17 марта 2009

Моя копия стандарта C ++ 2003 говорит, что шаблоны numeric_limits<>::max() и min() будут возвращать значения:

Эквивалент CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, и т. Д.

Эквивалент CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX, и т. Д.

Однако это в сносках. Директивы ИСО / МЭК, часть 3: «[Сноски] не должны содержать требований». Хотя сноски к таблицам или рисункам могут быть требованиями.

2 голосов
/ 17 марта 2009

Первое должно быть гарантировано верно: std::numeric_limits<int>::max() == INT_MAX.

Однако для unsigned long long нет никаких гарантий, так как компилятор / библиотеки не обязаны их поддерживать. Но ...

Если ваш компилятор и библиотеки поддерживают unsigned long long, он должен быть одинаковым, поскольку ограничения для типов будут одинаковыми независимо от того, как вы спрашиваете.

да, это разумное предположение.

1 голос
/ 17 марта 2009

Очевидно, что нет никаких гарантий для длинных длинных типов данных в C ++, так как длинных длинных типов данных еще не существует в C ++. Как они ведут себя, если и когда они существуют, зависит от компилятора и должно быть задокументировано компилятором.

0 голосов
/ 17 марта 2009

Хотя, насколько мне известно, это не является частью какого-либо стандарта, это, безусловно, разумное предположение, особенно если у вас есть компиляторы из того же набора или поставщика. Например, G ++ 4.3 просто использует # определенные значения из <limits> в <climits>.

...