Какой самый современный и идиоматический способ определения типа safe & quot; byte & quot; (как в 8 битах) типа в C ++?

Я хочу определить byte введите в моей программе C ++, в основном unsigned char Какой самый идиоматичный способ сделать это?

Я хочу определить byte type, чтобы абстрагироваться от различных представлений и сделать возможным создание безопасных массивов этого нового byte (8-битный) тип, который поддерживается unsigned char для библиотеки манипуляций с битами, над которой я работаю для очень конкретного случая использования программы, которую я создаю. Я хочу, чтобы это было очень явный что это 8-битный байт, специфичный для домена моей программы, и это не зависит от различных реализаций, основанных на платформе или компиляторе.

0

Решение

char, unsigned char, или же signed char все один байт; std::uint8_t (от <cstdint>) является 8-битным байтом (также существует подписанный вариант). Последний существует только в системах с 8-битными байтами. Существует также std::uint_least8_t (из того же заголовка), который имеет по крайней мере 8 бит и std::uint_fast8_t, который имеет не менее 8 битов и должен быть наиболее эффективным.

4

Другие решения

Самый идиоматический способ — это просто использовать signed char или же unsigned char, Вы можете использовать typedef, если хотите позвонить byte или, если вам нужна строгая типизация, вы можете использовать BOOST_STRONG_TYPEDEF.

Если вам нужно ровно 8 бит, вы можете использовать uint8_t от <cstdint> но это не гарантировано, чтобы существовать на всех платформах.

2

Если честно, для меня это одна из самых раздражающих «функций» в C ++.

Да, вы можете использовать std::uint8_t или же unsigned charкоторый в большинстве систем первым будет typedef из последних.

Но … Это не тип безопасности, как typedef не будет создавать новый тип. И комитет отказался добавить «сильный typedef» в стандарт.

рассматривать

void foo (std::uint8_t);
void foo (unsigned char); // ups...
2

В настоящее время я использую подход uint8_t. Я вижу это так: если у платформы нет 8-битного типа (в этом случае мой код не будет работать на этой платформе), то я не хочу, чтобы он работал в любом случае, потому что я получал бы неожиданное Поведение связано с тем, что я обрабатываю данные с предположением, что это 8 бит, тогда как на самом деле это не так. Поэтому я не понимаю, почему вы должны использовать unsigned char, предположить, что он равен 8 битам, а затем выполнить все ваши вычисления на основе этого предположения. Это просто напрашивается на неприятности, по моему мнению.

1
По вопросам рекламы [email protected]