C ++样式从unsigned char *转换为const char *

时间:2009-03-18 16:00:37

标签: c++ const casting

我有:

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 ++风格投射此处的正确方法是什么?

7 个答案:

答案 0 :(得分:54)

char *const unsigned char *被视为不相关的类型。所以你想使用reinterpret_cast

但如果您从const unsigned char*转到非const类型,则需要先使用const_castreinterpret_cast无法取消constvolatile资格。

答案 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]章说它们之间存在关系:

  

普通charsigned charunsigned char是三种不同的类型,统称为窄字符类型。 charsigned charunsigned 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;