Преобразование стиля C ++ из неподписанного символа * в постоянное значение * - PullRequest
74 голосов
/ 18 марта 2009

у меня есть:

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));

Ошибка: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

Какой правильный способ кастовать здесь в стиле C ++?

Ответы [ 7 ]

54 голосов
/ 18 марта 2009

char * и const unsigned char * считаются несвязанными типами. Итак, вы хотите использовать reinterpret_cast.

Но если вы переходите от const unsigned char* к типу, отличному от const, вам сначала нужно будет использовать const_cast. reinterpret_cast не может отменить квалификацию const или volatile.

49 голосов
/ 18 марта 2009

Попробуйте reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
43 голосов
/ 18 марта 2009

reinterpret_cast

17 голосов
/ 17 июля 2010

unsigned char * - это в основном байтовый массив, и его следует использовать для представления необработанных данных, а не строки в целом. Строка Unicode будет представлена ​​как wchar_t *

В соответствии со стандартом C ++ reinterpret_cast между unsigned char * и char * безопасен, поскольку они имеют одинаковый размер и одинаковую конструкцию и ограничения. Я стараюсь избегать reintrepret_cast даже больше, чем const_cast в целом.

Если статическое приведение не удается с тем, что вы делаете, вы, возможно, захотите пересмотреть свой дизайн, потому что, честно говоря, если вы используете C ++, вы можете воспользоваться тем, что предлагает часть «плюс плюс», и использовать строковые классы и STL (aka std :: basic_string может работать лучше для вас)

6 голосов
/ 18 марта 2009

Вам нужно будет использовать reinterpret_cast<>, так как два типа, между которыми вы ведете каст, не связаны друг с другом.

2 голосов
/ 12 октября 2018

Слишком много комментариев для разных ответов, поэтому я оставлю здесь еще один ответ.

Вы можете и должны использовать reinterpret_cast<>, в вашем случае

str.append(reinterpret_cast<const char*>(foo()));

потому что, хотя эти два разных типа, стандарт 2014 года, глава 3.9.1 Fundamental types [basic.fundamental] гласит: существует связь между ними:

Обычный char, signed char и unsigned char - это три различных типа, которые в совокупности называются типами узких символов. A char, signed char и unsigned char занимают одинаковое количество памяти и имеют одинаковые требования к выравниванию (3.11); то есть они имеют одинаковое объектное представление.

(выбор мой)

Вот доступная ссылка: https://en.cppreference.com/w/cpp/language/types#Character_types

Использование wchar_t для Unicode / многобайтовых строк устарело: Стоит ли использовать wchar_t при использовании UTF-8?

0 голосов
/ 25 октября 2011

Надеюсь, это поможет. :)

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
...