Наш продукт выпускается на нескольких типах UNIX и на Windows. К счастью, все релизы с этого года только 64-бит, включая Windows (Server 2008 и Studio 2010).
Увы, но наследие 32-х бит сильно мешает и засоряет код. И одна их ключевых проблем - базовые типы.
Сейчас мы пришли к выводу, что зоопарк типов надо прекращать.
Итак, правило.
Слова char
, short
, long
, long long
, __int64
по умолчанию запрещены. Их использование придется объяснить на code review. Если нужна переменная, которая логически не является смещением в памяти, и ее предельные значения с запасом укладываются в интервал от -2^31 до 2^31-1, по это просто int
. Если это индекс или смещение в памяти - это size_t
.
Если же нужен беззнаковый тип, или конкретный размер, то надо использовать типа из stdint.h
(int8_t
, uint8_t
, uint16_t
, int16_t
, uint32_t
, int64_t
, uint64_t
), которые аккуратно реализованы для каждой платформы в одном единственном месте.
Шаг радикальный, посмотрим как пойдет.
Кстати, как вы справляетесь вот с этим?
for (int i = 0; i < s.length(); ++i)
Убрать предупреждение о приведении size_t
к int
можно, изменив на:
for (size_t i = 0; i < s.length(); ++i)
Но как быть с:
for (int i = s.length(); i >= 0; --i)
Тут уже на size_t не изменить и надо внучную писать int i = static_cast<int>(s.length())
, что, конечно, плохо.
Похожая петрушка с strlen()
, также возвращающей size_t
.