Что такое переносимый метод для определения максимального значения size_t?
Я хотел бы узнать максимальное значение size_t в системе, в которой работает моя программа.
Мой первый инстинкт состоял в том, чтобы использовать отрицательный 1, например:
size_t max_size = (size_t)-1;
Но я предполагаю, что там лучший способ, или константа, определенная где-то.
Ответы
Ответ 1
В C99 существует константа манифеста (макрос) и называется SIZE_MAX
. Там нет такой константы в C89/90.
Однако то, что у вас в исходном посте, - это совершенно переносимый метод нахождения максимального значения size_t
. Он гарантированно работает с любым беззнаковым типом.
Ответ 2
#define MAZ_SZ (~(size_t)0)
или SIZE_MAX
Ответ 3
В качестве альтернативы бит-операциям, предложенным в других ответах, вы можете сделать это в С++
#include <limits>
size_t maxvalue = std::numeric_limits<size_t>::max()
Ответ 4
Решение size_t max_size = (size_t)-1;
, предложенное OP, безусловно, является лучшим до сих пор, но я выяснил еще один, более запутанный способ сделать это. Я отправляю его только для академического любопытства.
#include <limits.h>
size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1;
Ответ 5
Если вы предполагаете как минимум компилятор С++ 11, то SIZE_MAX должен быть доступен вам:
http://en.cppreference.com/w/c/types/limits