无效的将 'const char*' 转换为 'unsigned char*'

29
一个简单的C++代码:
int main(){
unsigned char* t="123";
}

编译使用g++时出现以下错误:
invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]

为什么?

因为字符串字面值是const。 - Oliver Charlesworth
谢谢。那么如何解决呢?除了使用std::string之外 - anupamD
是的,如果它是字符串字面值,gcc不会报错。 - anupamD
1
如果你的意思是使用C编译器不会出错,那部分原因是在C中,"123"的类型为char[4],而在C++中它的类型为const char[4]。GCC如果没有以标准模式调用,也允许在char *unsigned char *之间进行转换而无需强制转换。 - M.M
const unsigned char* tmp = reinterpret_cast<const unsigned char *>("123"); t = const_cast<unsigned char *>(tmp) - kgbook
4个回答

39

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
@anupamD 最好遵循标准,而不是使用编译器的语言扩展。 :) - Vlad from Moscow
初始化程序具有类型 const char[4] - M.M

4

另一种方法可以为您提供可修改的unsigned char数组,就像您最初想要的那样:

#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而无需显式转换。

0

当你使用自定义宏时,将一种类型转换为另一种类型变得非常容易。因此,这里提供了一组宏,您可以在任何平台上使用(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");

3
这些宏并没有短多少,只是让代码更加难以理解。 - Sopel
2
为什么要踩?如果有错误,那是可以接受的,但我正在尝试帮助想要在转换中使用宏的程序员。使用宏并不是必须的,任何人都可以使用长字面量... - SajithP

0

只需在声明时使用char*而不是unsigned char*

  1. char t[MAX_SIZE] =“123”; // MAX_SIZE应该先定义

  2. 经过时间考验的strcpy()strncpy()函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接