unsigned char *in = "hello world"
Это неверно в C ++: "hello world"
является строковым литералом и имеет тип const char[12]
. В C он имеет тип char[12]
, но const
здесь не имеет значения, потому что в C ++ есть неявное (но не рекомендуемое) преобразование, которое позволяет преобразовать строковый литерал в char*
.
Проблема в том, что char
и unsigned char
- это разные типы. Не имеет значения, является ли char
неподписанным; три типа char
(char
, unsigned char
и signed char
) все различны, и в C ++ вы не можете преобразовывать указатели на эти три типа без приведения.
Это работает в C, потому что в C вы можете преобразовать любой тип указателя на объект в любой другой тип указателя на объект без приведения. Это не так в C ++.
В C ++ вам нужно использовать:
// use the implicit conversion to 'char*' to cast away constness:
char* p = "hello world";
// explicitly cast to 'unsigned char*'
unsigned char* in = reinterpret_cast<unsigned char*>(p);
Удаление константности обычно является плохой идеей, поскольку строковые литералы не могут быть изменены, но иногда это необходимо при работе с устаревшими библиотеками, которые не являются правильными.
Преобразование из char*
в unsigned char*
безопасно, поскольку все объекты могут обрабатываться как массив char
, unsigned char
или signed char
в C ++.