*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

вторник, 6 сентября 2011 г.

Типы в C++ с явным указанием размера

Наш продукт выпускается на нескольких типах 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.

Комментариев нет:

Отправить комментарий