Что такое переносимый метод для определения максимального значения 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;