Приведение стиля C++ из unsigned char * в const char *

У меня есть:

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

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

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


person jackhab    schedule 18.03.2009    source источник
comment
unsigned char обычно используется для хранения строк в стиле Unicode, вы уверены, что хотите напрямую преобразовать его, а не преобразовать содержимое?   -  person Greg Domjan    schedule 18.03.2009


Ответы (7)


переинтерпретировать_cast

person Ruben Bartelink    schedule 18.03.2009
comment
@jesses.co.tt Спасибо за минус. Ключевой особенностью этого поста, благодаря которому за него проголосовали, является его своевременность. Другие ответы содержат различные детали, и их лучше всего читать и голосовать отдельно. Если @JaredPars answer охватывает то, что вы ищете, я бы использовал это и/или проголосовал за него. Вы заметите, что я потратил время на улучшение их формата. Я действительно не вижу смысла расширять этот ответ, чтобы охватить содержание других. - person Ruben Bartelink; 20.08.2013
comment
хорошо, я понимаю, что вы здесь рассуждаете, и если рассматривать всю страницу в целом, я согласен, что не было необходимости переформулировать... Я думаю, трудно не торопиться и смотреть на всю страницу и временные метки, а не оценивая каждый ответ по его достоинству ... но точка зрения принята (особенно от того, у кого в 55 раз больше репутации, чем у меня!) - person jesses.co.tt; 20.08.2013
comment
@jesses.co.tt Не волнуйтесь, я понимаю вашу точку зрения, и вы не сильно ошибаетесь. Честно говоря, я уже давно не «соревновался» в тегах с высоким трафиком с такими быстрыми ответами типа «оружие на западе». Но вы не получите такого уровня репутации, удалив свой ответ, даже если это правильно (что в другой день я бы так же счастливо поспорил!). Итак, у нас есть стена текста, загромождающая место, так что ваша миссия выполнена :P - person Ruben Bartelink; 21.08.2013
comment
Мне особенно нравится, как ты был так заинтересован в том, чтобы кричать ПЕРВЫЙ! что вы даже не побеспокоились о basic formatting. - person OJFord; 20.03.2015
comment
Это действительно бесполезный ответ. Он просто не дает никакой информации. - person OYRM; 19.07.2016
comment
@RubenBartelink, зачем тогда отвечать, если ваш ответ ничего не добавляет и не может стоять сам по себе? если вы не понимаете, почему этот ответ нуждается в расширении, возможно, вам следует удалить его. - person Bulbasaur; 06.12.2020

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

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

person Brian R. Bondy    schedule 18.03.2009
comment
Несвязанность здесь вводит в заблуждение: создается впечатление, что вы не можете перевести одно на другое. Я читаю проект 2014 года, 3.9.1 Основные типы, и в нем говорится: char, signed char и unsigned char занимают одинаковый объем памяти и имеют одинаковые требования к выравниванию. ЭТО отношения. Или вот более удобочитаемая ссылка: en.cppreference.com/w/cpp/language /types#Character_types - person Victor Sergienko; 12.10.2018

Попробуйте reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
person JaredPar    schedule 18.03.2009

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

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

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

person AJG    schedule 16.07.2010

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

person Timo Geusch    schedule 18.03.2009

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

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

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

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

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

(выбор мой)

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

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

person Victor Sergienko    schedule 12.10.2018

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

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
person joi    schedule 25.10.2011