web-dev-qa-db-fra.com

Conversion de style C++ de char non signé * en char const *

J'ai:

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));

L'erreur: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

Quelle est la bonne façon de lancer ici en C++?

66
jackhab

réinterpréter_cast

43
Ruben Bartelink

char * et const unsigned char * sont considérés comme des types non liés. Donc, vous voulez utiliser reinterpret_cast.

Toutefois, si vous passez de const unsigned char* à un type non const, vous devez d'abord utiliser const_cast. reinterpret_cast ne peut pas rejeter une qualification const ou volatile.

53
Brian R. Bondy

Essayez reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
47
JaredPar

unsigned char * est fondamentalement un tableau d'octets et doit être utilisé pour représenter des données brutes plutôt qu'une chaîne en général. Une chaîne unicode serait représentée par wchar_t *

Selon la norme C++, une réinterprétation-diffusion entre unsigned char * et char * est sans danger, car ils ont la même taille, la même construction et les mêmes contraintes. J'essaie d'éviter reintrepret_cast encore plus que const_cast en général.

Si la conversion statique échoue avec ce que vous faites, vous voudrez peut-être reconsidérer votre conception. Franchement, si vous utilisez le C++, vous voudrez peut-être tirer parti de ce que la partie "plus plus" propose et utiliser des classes de chaînes et STL (aka std :: basic_string pourrait mieux fonctionner pour vous)

17
AJG

Vous devrez utiliser un reinterpret_cast<> car les deux types que vous utilisez ne sont pas liés. 

6
Timo Geusch

Trop de commentaires à formuler pour des réponses différentes, je vais donc laisser une autre réponse ici.

Vous pouvez et devriez utiliser reinterpret_cast<>, dans votre cas

str.append(reinterpret_cast<const char*>(foo()));

parce que, bien que ces deux types soient différents, la norme de 2014, le chapitre 3.9.1 Fundamental types [basic.fundamental] indique qu'il existe une relation entre eux:

Plain char, signed char et unsigned char sont trois types distincts, appelés collectivement types de caractères étroits. Un char, un signed char et un unsigned char occupent la même quantité de mémoire et ont les mêmes exigences d'alignement (3.11); c'est-à-dire qu'ils ont la même représentation d'objet.

Voici un lien disponible: https://en.cppreference.com/w/cpp/language/types#Character_types

L'utilisation de wchar_t pour les chaînes Unicode/multi-octets est obsolète: Dois-je utiliser wchar_t lors de l'utilisation de UTF-8?

1
Victor Sergienko