C + + 样式从 unsignedchar * 转换为 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*’

这里用 C + + 风格转换的正确方法是什么?

127834 次浏览

重新解释 _ 强制转换

您需要使用 reinterpret_cast<>,因为您正在强制转换的两种类型彼此无关。

试试 reinterpret_cast

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

char *const unsigned char *被认为是不相关的类型。

但是如果你要从 const unsigned char*转换到非 const类型,你首先需要使用 const_castreinterpret_cast不能抛弃 constvolatile资格。

Unsignedchar * 基本上是一个字节数组,应该用来表示原始数据,而不是一般的字符串。Unicode 字符串表示为 wchar _ t *

根据 C + + 标准,在 unsignedchar * 和 char * 之间重新解释转换是安全的,因为它们大小相同,具有相同的结构和约束。一般来说,我会尽量避免 retrepret _ cast,甚至比 const _ cast 更加避免。

如果静态强制转换失败,你可能需要重新考虑你的设计,因为坦率地说,如果你使用 C + + ,你可能想利用“加号”部分提供的优势,使用字符串类和 STL (又名 std: : basic _ string 可能更适合你)

希望对你有帮助

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

对于不同的答案有太多的评论,所以我将在这里留下另一个答案。

在您的情况下,可以并且应该使用 reinterpret_cast<>

str.append(reinterpret_cast<const char*>(foo()));

因为,虽然这两个是不同的类型,2014年的标准,章 3.9.1 Fundamental types [basic.fundamental]有的他们之间的关系:

简单的 charsigned charunsigned char是三种不同的类型,统称为窄性格类型

(选择是我的)

这里有一个可用的链接: https://en.cppreference.com/w/cpp/language/types#Character_types

对 Unicode/multibyte 字符串使用 wchar_t已经过时了: 使用 UTF-8时是否应该使用 wchar _ t?