Должен ли я использовать реализацию C или C ++ для возврата максимального размера типа переменной? - PullRequest
1 голос
/ 23 июня 2010

С точки зрения стандартов, я должен использовать следующее из заголовка C ++ <limits>?

UCHAR_MAX которая является реализацией c или std::numeric_limits<unsigned char>::max(), которая является реализацией C ++.

Результат эквивалентен между двумя версиями, но я должен выбрать реализацию, основанную на каком-либо стандарте или на удобочитаемости и переносимости в этом случае. Обратите внимание, что эта реализация должна быть кросс-платформенной. Я пишу код C ++.

Ответы [ 4 ]

9 голосов
/ 23 июня 2010

Если вы хотите, чтобы код мог компилироваться как C, тогда вам в значительной степени нужно использовать <limits.h>. Если вы пишете на C ++, лучше использовать заголовок C ++ <limits>. Последний позволяет вам написать код, который будет работать в шаблонах, которые не могут быть дублированы с заголовком C:

template <class T>
class mytemplate { 
    T x;
    void somefunc() { x = std::numeric_limits<T>::max(); } // or whatever...
};
0 голосов
/ 23 июня 2010

Вы должны использовать , чтобы оставаться последовательным.

На платформе Windows, если вы включите, вы также можете захотеть

#define NOMINMAX

, чтобы избежать конфликта имен с min и max.

0 голосов
/ 23 июня 2010

Знай, на каком языке ты пишешь, и пиши на этом языке. Если вы пишете на C ++, используйте стандартные способы работы C ++.

Стандарт C ++ обычно кросс-платформенный (есть исключения, например export, но export все равно удаляется из C ++ Standard) Обычно удобнее читать конструкции C ++, чем переключаться между конструкциями C и C ++.

0 голосов
/ 23 июня 2010

Когда вы используете C, std::numeric_limits явно недоступен.

В C ++ это зависит от того, что вы хотите сделать - std::numeric_limits<T>::max() не является константным выражением с текущим стандартом C ++.
В этих случаях альтернативой макросам C-ish будет использование чего-то вроде Boost.Integers целочисленных признаков const_min / const_max, что также работает в шаблонном контексте.

...