Un code C++ simple:
int main(){
unsigned char* t="123";
}
sur la compilation avec g ++ donne l'erreur suivante:
invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]
Pourquoi?
En C++, les littéraux de chaîne ont des types de tableaux de caractères constants. Par exemple, la chaîne littérale "123"
est de type const char[4]
.
Dans les expressions avec des exceptions rares, les tableaux sont convertis en pointeurs vers leurs premiers éléments.
Donc, dans cette déclaration
unsigned char* t="123";
l'initialiseur a le type const char *
. Il n'y a pas de conversion implicite de const char *
à unsigned char *
Tu pourrais écrire
const unsigned char* t = reinterpret_cast<const unsigned char *>( "123" );
Une autre approche, qui vous fournit un tableau modifiable unsigned char
comme vous le vouliez initialement, est la suivante:
#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;
}
Vous pouvez ajouter const
aux deux déclarations si vous le souhaitez pour obtenir const unsigned char
sans conversion explicite.
Les conversions d'un type à un autre sont faciles lorsque vous utilisez des macros définies par vous-même. Voici donc un ensemble de macros que vous pouvez utiliser sur n’importe quelle plate-forme (Windows, Linux, Solaris, AIX, etc.).
#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
Dans ton cas
const unsigned char* t = reinterpret_cast<const unsigned char *>("UCHAR TO CONST UCHAR");
est équivalent à
const unsigned char* t = M_ToConstUCharPtr("UCHAR TO CONST UCHAR");
Simplement utiliser
juste char * à la place de char non signé * pendant la déclaration
char t [MAX_SIZE] = "123"; // MAX_SIZE devrait être défini plus tôt
temps testé strcpy () et strncpy functions