从无符号char *转换为const char *的C ++样式


78

我有:

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 ++样式投射到这里的正确方法是什么?


3
unsigned char通常用于保存unicode样式的字符串,您确定要直接转换它而不是转换内容吗?
Greg Domjan 09年

Answers:


47

reinterpret_cast


52
例子吗?
jesses.co.tt

6
@ jesses.co.tt感谢您的反对。这篇文章的主要特点是其及时性。其他答案提供各种细节,最好分别阅读和支持。如果@JaredPars答案涵盖了您要查找的内容,则可以使用它和/或对其进行投票。您会注意到,我也花了一些时间来改进这些格式。我真的看不出将这个答案扩展到包含其他内容的意义。
鲁宾·巴特林克

3
好吧,我了解您在这里是有道理的,并且整个页面都用了,我同意不需要重新阐述...我想很难花时间去查看整个页面和时间戳而不是根据自己的优点来判断每个答案...但是要注意一点(特别是来自享有55倍以上声誉的人!)
jesses.co.tt

22
我特别喜欢您如何担心喊“第一!” 你甚至不用担心basic formatting
OJFord

8
这是一个真正无用的“答案”。它只是不提供任何信息。
OYRM '16

60

char *并被const unsigned char *视为无关类型。所以你要用reinterpret_cast

但是,如果您要const unsigned char*使用非const类型,则需要先使用const_castreinterpret_cast无法放弃constvolatile资格。


3
“无关”在这里是令人误解的:它给人的印象是您无法从一个投射到另一个。我正在阅读2014年的草案“ 3.9.1基本类型”,它说:“ A char,asigned charunsigned char占据相同的存储量,并具有相同的对齐要求”。这是一种关系。或者,这里有一个更具可读性的链接:en.cppreference.com/w/cpp/language/types#Character_types
Victor Sergienko

52

尝试 reinterpret_cast

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

18

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

根据C ++标准,无符号char *和char *之间的reinterpret_cast是安全的,因为它们的大小相同且具有相同的构造和约束。通常,我尝试比const_cast更避免reintrepret_cast。

如果静态转换因您的操作而失败,则您可能需要重新考虑设计,因为坦率地说,如果您使用的是C ++,则可能想利用“ plus plus”部分提供的功能,并使用字符串类和STL(aka std :: basic_string可能更适合您)


6

您将需要使用a,reinterpret_cast<>因为您要在两者之间进行转换的两种类型彼此无关。


5

无法对不同答案做出太多评论,因此在此我将留下另一个答案。

你可以和应该使用reinterpret_cast<>,你的情况

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

因为尽管这两种是不同的类型,但根据2014年标准,该章3.9.1 Fundamental types [basic.fundamental]说它们之间存在关联:

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

(选择是我的)

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

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


-4

希望对您有所帮助。:)

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.