从“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 *‘ )
cannot convert from 'const char [3]' to 'char'