странное литье без знака - PullRequest
       1

странное литье без знака

6 голосов
/ 08 сентября 2010

Какова цель / преимущество / отличие использования

/* C89 compliant way to cast 'char' to 'unsigned char'. */
static inline unsigned char
to_uchar (char ch)
{
  return ch;
}

по сравнению со стандартным составом?

Редактировать: Нашел в base64 код в гнулиб

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Назначение

Кому:

  • В ролях от char до unsigned char
  • Делайте больше с актерами, чем с обычными
  • Откройте для себя возможности индивидуального литья между другими типами и выберите из перечисленных ниже преимуществ для тех, кто также

Преимущество

Можно было бы:

  • Прерывание приведениях такого типа при отладке
  • Отслеживание и количественное определение использования приведений с помощью инструментов профилирования
  • Добавить код проверки ограничений (довольно мрачно для char преобразований, но потенциально очень полезно для приведения больших / меньших типов)
  • Есть мания величия
  • Существует единственная точка приведения, которая позволяет вам тщательно анализировать и изменять код, который генерируется
  • Вы можете выбрать один из нескольких методов приведения в зависимости от окружения (например, в C ++ вы можете использовать numeric_limits<>)
  • Приведение является явным и никогда не будет генерировать предупреждения (или, по крайней мере, вы можете принудительно подавить их в одном месте)

Разница

  • Медленнее с плохими компиляторами или хорошими компиляторами с выключенными необходимыми флагами оптимизации
  • Язык не требует согласованности, вы можете не заметить, что забыли использовать приведение местами
  • Что-то странное и Java-esque, вероятно, следует принять и изучить слабую типизацию Си и разбираться с ней в каждом конкретном случае, а не пытаться вызывать специальные функции, чтобы справиться
1 голос
/ 08 сентября 2010

Может быть, программисту, написавшему функцию, не понравится синтаксис приведения ...

foo(to_uchar(ch));      /* function call */
foo((unsigned char)ch); /* cast */

Но я все равно позволю компилятору позаботиться об этом:)

void foo(unsigned char);
char s[] = "bar";
foo(s[2]); /* compiler implicitly casts the `s[2]` char to unsigned char */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...