web-dev-qa-db-fra.com

Conversion non valide de ‘const char *’ à ‘unsigned char *’

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?

12
anupamD

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" );
22
Vlad from Moscow

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.

3
Davislor

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");
1
SajithP

Simplement utiliser 

  1. juste char * à la place de char non signé * pendant la déclaration

  2. char t [MAX_SIZE] = "123"; // MAX_SIZE devrait être défini plus tôt

  3. temps testé strcpy () et strncpy functions

0
malang