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++?
réinterpréter_cast
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
.
Essayez reinterpret_cast
unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
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)
Vous devrez utiliser un reinterpret_cast<>
car les deux types que vous utilisez ne sont pas liés.
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
etunsigned char
sont trois types distincts, appelés collectivement types de caractères étroits. Unchar
, unsigned char
et ununsigned 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?