У меня есть:
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*’
Каков правильный способ использования здесь в стиле С++?
reinterpret_cast
char *
и const unsigned char *
считаются несвязанными типами. Поэтому вы хотите использовать reinterpret_cast
.
Но если вы переходите от const unsigned char*
к типу non const
, вам нужно сначала использовать const_cast
. reinterpret_cast
не может отбросить квалификацию const
или volatile
.
Попробуйте reinterpret_cast
unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
unsigned char * является в основном байтовым массивом и должен использоваться для представления необработанных данных, а не строки в целом. Строка Unicode будет представлена как wchar_t *
В соответствии со стандартом С++ reinterpret_cast между unsigned char * и char * безопасен, поскольку они одного размера и имеют одну и ту же конструкцию и ограничения. Я пытаюсь избежать reintrepret_cast еще больше, чем const_cast в целом.
Если статическое приведение не выполняется с тем, что вы делаете, вы можете захотеть пересмотреть свой дизайн, потому что, откровенно говоря, если вы используете С++, вы можете воспользоваться преимуществами части "плюс плюс" и использовать строковые классы и STL (aka std:: basic_string может работать лучше для вас)
Вам нужно будет использовать reinterpret_cast<>
, поскольку два типа, которые вы выполняете, не связаны друг с другом.
Надеюсь, что это поможет.:)
const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;