Что такое портативный метод для поиска максимального значения размера t?

Я хотел бы знать максимальное значение size_t в системе, в которой работает моя программа. Моим первым инстинктом было использовать отрицательный 1, например:

size_t max_size = (size_t)-1;

но я предполагаю, что есть лучший способ или константа, определенная где-то.

5 ответов


константа манифеста (макрос) существует в C99 и называется SIZE_MAX. Однако в C89/90 нет такой константы.

однако то, что у вас есть в исходном сообщении, - это совершенно портативный метод поиска максимального значения size_t. Гарантируется работа с любым типом без знака.


#define MAZ_SZ (~(size_t)0)

или SIZE_MAX


в качестве альтернативы битовым операциям, предложенным в других ответах, вы можете сделать это в C++

#include <limits>
size_t maxvalue = std::numeric_limits<size_t>::max()

на 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;

Если вы предполагаете, по крайней мере, компилятор C++11, то SIZE_MAX должен быть доступен для вас:

http://en.cppreference.com/w/c/types/limits