У меня есть:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
Ошибка: invalid static_cast from type ‘unsigned char*’ to type ‘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*’
Каков правильный способ приведения здесь в стиле С++?
переинтерпретировать_cast
basic formatting
.
- person OJFord; 20.03.2015
char *
и const unsigned char *
считаются несвязанными типами. Итак, вы хотите использовать reinterpret_cast
.
Но если вы переходите от const unsigned char*
к типу, отличному от const
, вам нужно сначала использовать const_cast
. reinterpret_cast
не может отказаться от квалификации const
или volatile
.
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()));
unsigned char* в основном представляет собой массив байтов и должен использоваться для представления необработанных данных, а не строки в целом. Строка Юникода будет представлена как wchar_t*
Согласно стандарту C++, переинтерпретация_приведения между unsigned char* и char* безопасна, поскольку они имеют одинаковый размер, одинаковую конструкцию и ограничения. Я стараюсь избегать reintrepret_cast даже в большей степени, чем const_cast в целом.
Если статическое приведение не работает с тем, что вы делаете, вы можете пересмотреть свой дизайн, потому что, честно говоря, если вы используете C++, вы можете воспользоваться преимуществами того, что предлагает часть «плюс плюс», и использовать строковые классы и STL (aka std::basic_string может тебе лучше подойдет)
Вам нужно будет использовать reinterpret_cast<>
, так как два типа, между которыми вы выполняете кастинг, не связаны друг с другом.
Слишком много комментариев к разным ответам, поэтому я оставлю здесь еще один ответ.
Вы можете и должны использовать 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?
Надеюсь, это поможет. :)
const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;