从“const char*”到“unsigned char*”的无效转换

Posted

技术标签:

【中文标题】从“const char*”到“unsigned char*”的无效转换【英文标题】:Invalid conversion from ‘const char*’ to ‘unsigned char*’ 【发布时间】:2016-03-31 23:00:53 【问题描述】:

一个简单的 C++ 代码:

int main()
unsigned char* t="123";

使用 g++ 编译时出现以下错误:

invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]

为什么?

【问题讨论】:

因为字符串字面量是 const。 谢谢。那么如何解决呢?除了使用 std::string 是的,如果它是字符串文字,gcc 不会给出错误。 如果您的意思是使用 C 编译器不会产生错误,那(部分)是因为在 C 中,"123" 的类型为 char[4],而在 C++ 中的类型为 const char[4]。 gcc ,如果不在标准模式下调用,也允许在 char *unsigned char * 之间进行转换而无需强制转换 const unsigned char* tmp= reinterpret_cast<const unsigned char *>( "123" ); t = const_cast<unsigned char *>(tmp). 【参考方案1】:

在 C++ 中,字符串文字具有常量字符数组的类型。例如字符串文字 "123" 的类型为 const char[4]

在具有罕见异常的表达式中,数组被转换为指向其第一个元素的指针。

所以在这个声明中

unsigned char* t="123";

初始化器的类型为const char *。没有从const char *unsigned char * 的隐式转换

你可以写

const unsigned char* t = reinterpret_cast<const unsigned char *>( "123" );

【讨论】:

感谢 gcc 以不同的方式处理它。 @anupamD 最好遵循标准而不是使用编译器的语言扩展。:) 初始化器的类型为const char[4]【参考方案2】:

另一种方法是:

#include <cstdlib>
#include <iostream>

using std::cout;
using std::endl;

int main()

    unsigned char ta[] = "123";
    unsigned char* t = ta;

    cout << t << endl;  // Or ta.

    return EXIT_SUCCESS;

如果您愿意,可以将 const 添加到两个声明中,以在没有显式转换的情况下获得 const unsigned char

【讨论】:

【参考方案3】:

当您使用自定义宏时,从一种类型转换为另一种类型很容易。所以这里有一组宏,您可以在任何平台(Windows、Linux、Solaris、AIX 等...)上使用

#define M_ToCharPtr(p)        reinterpret_cast<char*>(p)                   // Cast to char*
#define M_ToWCharPtr(p)       reinterpret_cast<wchar_t*>(p)                // Cast to wchar_t*
#define M_ToConstCharPtr(p)   reinterpret_cast<const char*>(p)             // Cast to const char*
#define M_ToConstWCharPtr(p)  reinterpret_cast<const wchar_t*>(p)          // Cast to const wchar_t*
#define M_ToUCharPtr(p)       reinterpret_cast<unsigned char*>(p)          // Cast to unsigned char*
#define M_ToConstUCharPtr(p)  reinterpret_cast<const unsigned char*>(p)    // Cast to const unsigned char*
#define M_ToUCharPtr(n)       reinterpret_cast<unsigned char*>(n)          // Cast to unsigned char*
#define M_ToVoidPtr(p)        reinterpret_cast<void*>(p)                   // Cast to void*
#define M_ToConstVoidPtr(p)   reinterpret_cast<const void*>(p)             // Cast to const void*
#define M_ToIntPtr(n)         reinterpret_cast<int*>(n)                    // Cast to int*
#define M_ToConstIntPtr(p)    reinterpret_cast<const int*>(p)              // Cast to const int*
#define M_ToDoublePtr(n)      reinterpret_cast<double*>(n)                 // Cast to double*
#define M_ToConstDoublePtr(n) reinterpret_cast<const double*>(n)           // Cast to const double*
#define M_ToBoolPtr(n)        reinterpret_cast<bool*>(n)                   // Cast to bool*
#define M_ToConstBoolPtr(n)   reinterpret_cast<const bool*>(n)             // Cast to const bool*

// General Cast
#define M_To(T, p)            reinterpret_cast<T>(p)                       // Cast to T

你的情况

const unsigned char* t = reinterpret_cast<const unsigned char *>("UCHAR TO CONST UCHAR");

等价于

const unsigned char* t = M_ToConstUCharPtr("UCHAR TO CONST UCHAR");

【讨论】:

这些宏并不短,只是混淆了代码。 为什么要投反对票?如果它是错误的,那么它是可以接受的,但我正在努力帮助想要在转换中使用宏的编码人员。不是必须使用宏,而是任何人都可以使用长文字...【参考方案4】:

简单地使用

    在声明过程中只用 char* 代替 unsigned char*

    char t[MAX_SIZE] = "123"; // 应该提前定义 MAX_SIZE

    经过时间测试的 strcpy()strncpy 函数

【讨论】:

以上是关于从“const char*”到“unsigned char*”的无效转换的主要内容,如果未能解决你的问题,请参考以下文章

如何从 const char* 转换为 unsigned int c++

错误记录Android NDK 编译报错 ( no known conversion from ‘unsigned char *‘ to ‘const char *‘ )

c++ uint32 如何转 const char

cannot convert from 'const char [3]' to 'char'

C++ 我将一个const char*的字符串转换为string出错

如何在 Swift 中声明一个静态 const char 数组? [关闭]