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

jac*_*hab 76 c++ casting const

我有:

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
Run Code Online (Sandbox Code Playgroud)

错误: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

在C++风格中投射的正确方法是什么?

Bri*_*ndy 56

char *并被const unsigned char *认为是不相关的类型.所以你想要使用reinterpret_cast.

但是如果你要从const unsigned char*const类型转变,你需要先使用const_cast.reinterpret_cast不能抛弃constvolatile资格.

  • "不相关"在这里有误导性:它给人的印象是你无法从一个人投射到另一个人.我正在阅读2014年的草稿,"3.9.1基本类型",它说:"``char`,`signed char`和`unsigned char`占用相同数量的存储并具有相同的对齐需求".这是一种关系.或者这里有一个更易读的链接:https://en.cppreference.com/w/cpp/language/types#Character_types (3认同)

Jar*_*Par 51

尝试 reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
Run Code Online (Sandbox Code Playgroud)


Rub*_*ink 46

reinterpret_cast的

  • 好的例子? (47认同)
  • 我特别喜欢你如此关注喊"第一次!" 你甚至不打扰"基本格式化". (21认同)
  • 这是一个真正无用的"答案".它根本不提供任何信息. (6认同)
  • @ jesses.co.tt感谢您的downvote.这篇文章的主要特点是它的及时性.其他答案提供了各种细节,最好单独阅读和推荐.如果[@JaredPars回答](http://stackoverflow.com/a/658924/11635)涵盖了您正在寻找的内容,我会使用它和/或对其进行投票.你会注意到我已经投入时间来改进那些格式.我真的没有意识到扩大这个答案以包含其他人的内容. (5认同)
  • 好的,我明白你在这里的理由,并作为一个完整的页面,我同意没有必要重新表达......我想很难花时间查看整个页面和时间戳而不是根据自己的优点来判断每个答案......但要注意(尤其是从我的声誉高出 55 倍的人那里!) (3认同)

AJG*_*AJG 17

unsigned char*基本上是一个字节数组,通常用于表示原始数据而不是字符串.unicode字符串将表示为wchar_t*

根据C++标准,unsigned char*和char*之间的reinterpret_cast是安全的,因为它们具有相同的大小并且具有相同的构造和约束.我总是试图避免reintrepret_cast比const_cast更多.

如果静态转换失败了你正在做的事情你可能想重新考虑你的设计,因为坦率地说,如果你使用的是C++,你可能想利用"plus plus"部分提供的东西并使用字符串类和STL(aka std :: basic_string可能对你更好)


Tim*_*sch 6

您需要使用a,reinterpret_cast<>因为您之间的两种类型彼此无关.


Vic*_*nko 6

太多的评论无法对不同的答案进行评论,所以我会在这里留下另一个答案。

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

str.append(reinterpret_cast<const char*>(foo()));
Run Code Online (Sandbox Code Playgroud)

因为,虽然这两个是不同的类型,但 2014 标准,章节3.9.1 Fundamental types [basic.fundamental]说它们之间存在关系:

平原charsigned charunsigned char有三种不同的类型,统称为窄字符类型。A char、 asigned char和 anunsigned char占用相同的存储量并具有相同的对齐要求(3.11);也就是说,它们具有相同的对象表示。

(选择是我的)

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

使用wchar_t:对Unicode /多字节字符串已经过时使用UTF-8的时候我应该使用wchar_t的?