Umwandlung des C ++ - Stils von vorzeichenlosem char * in const char *

78

Ich habe:

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

Der Fehler: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

Was ist der richtige Weg, um hier im C ++ - Stil zu gießen?

Jackhab
quelle
3
Zeichen ohne Vorzeichen wurden normalerweise zum Speichern von Zeichenfolgen im Unicode-Stil verwendet. Möchten Sie es wirklich direkt umwandeln, anstatt den Inhalt zu konvertieren?
Greg Domjan

Antworten:

48

reinterpret_cast

Ruben Bartelink
quelle
52
Beispiel bitte?
jesses.co.tt
6
@ jesses.co.tt Danke für die Ablehnung. Das Hauptmerkmal dieses Beitrags, das ihn auf den neuesten Stand bringt, ist seine Aktualität. Die anderen Antworten enthalten verschiedene Details und werden am besten separat gelesen und bewertet. Wenn die Antwort von @JaredPars das abdeckt, wonach Sie suchen, würde ich das verwenden und / oder es verbessern. Sie werden feststellen, dass ich die Zeit investiert habe, um auch das Format dieser zu verbessern. Ich sehe es wirklich nicht als sinnvoll an, diese Antwort auf den Inhalt der anderen auszudehnen.
Ruben Bartelink
3
ok, ich verstehe, dass Sie hier eine Begründung haben und als ganze Seite betrachtet, stimme ich zu, dass es nicht notwendig war, neu zu artikulieren ... Ich denke, es ist schwierig, sich die Zeit zu nehmen und stattdessen die gesamte Seite und die Zeitstempel zu betrachten Jede Antwort nach ihrem eigenen Verdienst beurteilen ... aber Punkt genommen (besonders von jemandem, der 55x mehr Ruf von mir hat!)
jesses.co.tt
22
Mir gefällt besonders, wie sehr Sie sich darum gekümmert haben, "FIRST!" dass du dich nicht einmal darum gekümmert hast basic formatting.
OJFord
7
Dies ist eine wirklich nutzlose "Antwort". Es liefert einfach keine Informationen.
OYRM
60

char *und const unsigned char *gelten als nicht verwandte Typen. Also willst du verwenden reinterpret_cast.

Wenn Sie jedoch const unsigned char*zu einem Nicht- constTyp wechseln möchten, müssen Sie diesen const_castzuerst verwenden. reinterpret_castkann keine constoder volatileQualifikation wegwerfen.

Brian R. Bondy
quelle
3
"Unrelated" ist hier irreführend: Es macht den Eindruck, dass man nicht von einem zum anderen werfen kann. Ich lese einen Entwurf von 2014, "3.9.1 Grundtypen", und er lautet: "A char, a signed charund a unsigned charbelegen dieselbe Speichermenge und haben dieselbe Ausrichtungsanforderung". Dies ist eine Beziehung. Oder hier ist ein besser lesbarer Link: en.cppreference.com/w/cpp/language/types#Character_types
Victor Sergienko
52

Versuchen reinterpret_cast

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

unsigned char * ist im Grunde ein Byte-Array und sollte verwendet werden, um Rohdaten und nicht generell eine Zeichenfolge darzustellen. Eine Unicode-Zeichenfolge würde als wchar_t * dargestellt

Gemäß dem C ++ - Standard ist ein reinterpret_cast zwischen vorzeichenlosem char * und char * sicher, da sie dieselbe Größe haben und dieselbe Konstruktion und dieselben Einschränkungen haben. Ich versuche, reintrepret_cast noch mehr zu vermeiden als const_cast im Allgemeinen.

Wenn die statische Umwandlung mit Ihrer Arbeit fehlschlägt, sollten Sie Ihr Design überdenken, denn wenn Sie C ++ verwenden, möchten Sie möglicherweise die Vorteile des Plus-Plus-Teils nutzen und Zeichenfolgenklassen und STL (auch bekannt als std :: basic_string) verwenden könnte besser für Sie arbeiten)

AJG
quelle
6

Sie müssten a verwenden, reinterpret_cast<>da die beiden Typen, zwischen denen Sie werfen, keine Beziehung zueinander haben.

Timo Geusch
quelle
5

Zu viele Kommentare zu unterschiedlichen Antworten, daher werde ich hier eine weitere Antwort hinterlassen.

Sie können und sollten reinterpret_cast<>in Ihrem Fall verwenden

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

Denn obwohl es sich bei diesen beiden Typen um verschiedene Typen handelt, 3.9.1 Fundamental types [basic.fundamental]heißt es im Standard von 2014, dass eine Beziehung zwischen ihnen besteht:

Plain char, signed charund unsigned chargibt drei verschiedene Arten, kollektiv schmalen Zeichentypen genannt. A char, a signed charund a unsigned charbelegen dieselbe Speichermenge und haben dieselben Ausrichtungsanforderungen (3.11); Das heißt, sie haben dieselbe Objektdarstellung.

(Auswahl ist meine)

Hier ist ein verfügbarer Link: https://en.cppreference.com/w/cpp/language/types#Character_types

Die Verwendung wchar_tfür Unicode / Multibyte-Zeichenfolgen ist veraltet: Soll ich bei Verwendung von UTF-8 wchar_t verwenden?

Victor Sergienko
quelle
-4

Hoffe es hilft. :) :)

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
joi
quelle