【问题标题】:C++ style cast from unsigned char * to const char *C++ 风格从 unsigned char * 转换为 const char *
【发布时间】:2010-10-14 02:54:24
【问题描述】:

我有:

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++ 样式中转换的正确方法是什么?

【问题讨论】:

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

标签: c++ constants casting


【解决方案1】:

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

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

【讨论】:

  • “无关”在这里具有误导性:它给人的印象是你无法从一个到另一个。我正在阅读 2014 年的草稿“3.9.1 基本类型”,上面写着:“charsigned charunsigned char 占用相同的存储量并具有相同的对齐要求” .这是一种关系。或者这里有一个更易读的链接:en.cppreference.com/w/cpp/language/types#Character_types
【解决方案2】:

试试reinterpret_cast

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

【讨论】:

    【解决方案3】:

    reinterpret_cast

    【讨论】:

    • @jesses.co.tt 感谢您的反对。这篇文章获得好评的关键特征是它的及时性。其他答案提供了各种细节,最好单独阅读和投票。如果@JaredPars answer 涵盖了您正在寻找的内容,我会使用它和/或支持它。你会注意到我也投入了时间来改进这些格式。我真的没有看到扩展这个答案以包含其他内容的意义。
    • 好的,我明白你在这里的理由,并作为一个完整的页面,我同意没有必要重新表达......我想很难花时间看看整个页面和时间戳,而不是根据每个答案的优劣来判断每个答案......但点(尤其是来自我的声誉高出 55 倍的人!)
    • @jesses.co.tt 别担心,我理解你的观点,你的想法并没有错。老实说,我已经很久没有在高流量标签中“竞争”这种西部最快的反应了。但是,即使这是正确的做法,也不会通过删除答案来获得这种级别的代表(改天我会同样高兴地争论!)。对,我们有一堵文字墙把这个地方弄得乱七八糟,所以你的任务就完成了:P
    • 我特别喜欢你如此关心喊“第一!”你甚至没有打扰basic formatting
    • 这是一个真正无用的“答案”。它根本不提供任何信息。
    【解决方案4】:

    unsigned char* 基本上是一个字节数组,应该用来表示原始数据,而不是一般的字符串。一个 unicode 字符串将被表示为 wchar_t*

    根据 C++ 标准,unsigned char* 和 char* 之间的 reinterpret_cast 是安全的,因为它们具有相同的大小并具有相同的构造和约束。我尽量避免使用 reintrepret_cast,甚至比一般的 const_cast 还要多。

    如果静态转换因您正在做的事情而失败,您可能需要重新考虑您的设计,因为坦率地说,如果您使用 C++,您可能希望利用“加号”部分提供的功能并使用字符串类和 STL(又名 std ::basic_string 可能更适合您)

    【讨论】:

      【解决方案5】:

      您需要使用reinterpret_cast&lt;&gt;,因为您要转换的两种类型彼此无关。

      【讨论】:

        【解决方案6】:

        太多cmets无法做出不同的答案,所以我会在这里留下另一个答案。

        在你的情况下,你可以而且应该使用reinterpret_cast&lt;&gt;

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

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

        普通的charsigned charunsigned char 是三种不同的类型,统称为窄字符类型。 一个char、一个signed char和一个unsigned char占用相同的存储量并且具有相同的对齐要求(3.11);也就是说,它们具有相同的对象表示。

        (选择是我的)

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

        对 Unicode/多字节字符串使用 wchar_t 已过时:Should I use wchar_t when using UTF-8?

        【讨论】:

          【解决方案7】:

          希望对您有所帮助。 :)

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多