【问题标题】:Invalid conversion from ‘const char*’ to ‘unsigned char*’从“const char*”到“unsigned char*”的无效转换
【发布时间】:2023-04-01 20:24:02
【问题描述】:

一个简单的 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).

标签: c++ casting type-conversion


【解决方案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】:

    简单地使用

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多