Какие предупреждения? Наиболее очевидным я могу подумать о «сужающемся преобразовании», то есть вы назначаете size_t
на номер unsigned int
и получаете предупреждение о том, что информация может быть потеряна.
Основной недостаток замены size_t
с unsigned long
что unsigned long
не гарантируются быть достаточно большим, чтобы вместить все возможные значения size_t
, и на Windows 64 он не является достаточно большим. Поэтому вы можете обнаружить, что у вас все еще есть предупреждения.
Правильное исправление заключается в том, что если вы назначаете size_t
переменной (или элементу данных), вы должны убедиться, что переменная имеет тип, достаточно большой, чтобы содержать любое значение size_t
. Вот что такое предупреждение. Поэтому вы не должны переключаться на unsigned long
, вы должны переключить эти переменные на size_t
.
И наоборот, если у вас есть переменная, которая не должна быть достаточно большой, чтобы держать любой размер, достаточно большой для unsigned int
, тогда не используйте для этого size_t
.
Оба типа (size_t
и unsigned int
) имеют действительные пользы, так что любой подход, который без разбора заменяет все их использование какого-либо другого типом должен быть неправильно :-) На самом деле, вы могли бы заменить все с size_t
или uintmax_t
и для большинство программ, которые были бы в порядке. Исключения составляют код, в котором используется код без знака того же размера, что и int
, или что-то еще такое, что более крупный тип нарушает код.
Если в какой-то момент спецификации библиотек меняются, а 'size_t' будет подписан, у вас будет много проблем. – Spook
Какова вероятность этого? size_t должен представлять адрес памяти ... –
Единственным недостатком является то, что в 64-битной Windows 'size_t'' 'unsigned long long', потому что' long' составляет всего 32 бита (даже в 64-битном режиме). –