我有:
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 ++风格投射此处的正确方法是什么?
答案 0 :(得分:54)
char *
和const unsigned char *
被视为不相关的类型。所以你想使用reinterpret_cast
。
但如果您从const unsigned char*
转到非const
类型,则需要先使用const_cast
。 reinterpret_cast
无法取消const
或volatile
资格。
答案 1 :(得分:48)
尝试reinterpret_cast
unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
答案 2 :(得分:43)
的reinterpret_cast
答案 3 :(得分:17)
unsigned char *基本上是一个字节数组,通常用于表示原始数据而不是字符串。 unicode字符串将表示为wchar_t *
根据C ++标准,unsigned char *和char *之间的reinterpret_cast是安全的,因为它们具有相同的大小并具有相同的构造和约束。我试图避免reintrepret_cast比一般的const_cast更多。
如果静态转换失败,你可能想重新考虑你的设计,因为坦率地说,如果你使用C ++,你可能想要利用“plus plus”部分提供的东西并使用字符串类和STL(又名std) :: basic_string可能对你更好)
答案 4 :(得分:6)
您需要使用reinterpret_cast<>
,因为您投射的两种类型彼此无关。
答案 5 :(得分:2)
评论太多,无法回答不同的答案,所以我在这里留下另一个答案。
您可以并且应该使用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 /多字节字符串已过时:Should I use wchar_t when using UTF-8?
答案 6 :(得分:-3)
希望有所帮助。 :)
const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;