2009-03-18 3 views
61

у меня есть:C++ стиль литой из неподписанного символа * на константный символ *

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++?

+3

неподписанные символ был, как правило, используется для хранения строк юникода в стиле, вы уверены, что вы хотите, чтобы непосредственно бросить его, а преобразование содержимого? –

ответ

39

reinterpret_cast

+36

пример пожалуйста? –

+5

@ jesses.co.tt Спасибо за downvote. Ключевой особенностью этой почты, которая заставляет ее поддержать, является ее своевременность. Другие ответы предоставляют различные детали и лучше всего читаются и сохраняются отдельно. Если ответ [@JaredPars] (http://stackoverflow.com/a/658924/11635) охватывает то, что вы ищете, я бы использовал его и/или повысил его. Вы заметите, что я потратил время на то, чтобы улучшить их формат. Я действительно не вижу смысла расширять этот ответ, чтобы охватить содержание других. –

+1

ok, я понимаю, что вы здесь обоснованы и взяты как целая страница, я согласен с тем, что нет необходимости повторно формулировать ... Я думаю, что трудно потратить время и посмотреть на всю страницу, а также на временные метки судить о каждом ответе на его собственную заслугу ... но точка взята (особенно от человека, у которого в 55 раз больше репутации от меня!) –

6

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

39

Попробуйте reinterpret_cast

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

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

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

15

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

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

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

-3

Hope it help. :)

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

Downvote: Не очень полезно и определенно не C++. – Lstor