Ein einfacher C++ - Code:
int main(){
unsigned char* t="123";
}
beim Kompilieren mit g ++ ergibt sich folgender Fehler:
invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]
Warum?
In C++ haben String-Literale Typen von konstanten Zeichenarrays. Beispielsweise hat das String-Literal "123"
den Typ const char[4]
.
In Ausdrücken mit seltenen Ausnahmen werden Arrays in Zeiger auf ihre ersten Elemente umgewandelt.
Also in dieser Erklärung
unsigned char* t="123";
der Initialisierer hat den Typ const char *
. Es erfolgt keine implizite Konvertierung von const char *
in unsigned char *
Du könntest schreiben
const unsigned char* t = reinterpret_cast<const unsigned char *>( "123" );
Ein anderer Ansatz, mit dem Sie ein änderbares unsigned char
-Array erhalten, das Sie ursprünglich wollten, ist:
#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;
}
Sie können const
zu beiden Deklarationen hinzufügen, wenn Sie möchten, dass const unsigned char
ohne explizite Umwandlung erhalten wird.
Konvertierungen von einem Typ zu einem anderen Typ sind einfach, wenn Sie selbst definierte Makros verwenden. Hier ist eine Reihe von Makros, die Sie auf jeder Plattform verwenden können (Windows, Linux, Solaris, AIX usw.)
#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
In Ihrem Fall
const unsigned char* t = reinterpret_cast<const unsigned char *>("UCHAR TO CONST UCHAR");
ist äquivalent zu
const unsigned char* t = M_ToConstUCharPtr("UCHAR TO CONST UCHAR");
Einfach verwenden
nur char * anstelle von unsigniertem char * während der Deklaration
char t [MAX_SIZE] = "123"; // MAX_SIZE sollte früher definiert werden
zeit getestet strcpy () und strncpy Funktionen