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?
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?
Antworten:
reinterpret_cast
basic formatting
.
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- const
Typ wechseln möchten, müssen Sie diesen const_cast
zuerst verwenden. reinterpret_cast
kann keine const
oder volatile
Qualifikation wegwerfen.
char
, a signed char
und a unsigned char
belegen 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
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)
Sie müssten a verwenden, reinterpret_cast<>
da die beiden Typen, zwischen denen Sie werfen, keine Beziehung zueinander haben.
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 char
undunsigned char
gibt drei verschiedene Arten, kollektiv schmalen Zeichentypen genannt. Achar
, asigned char
und aunsigned char
belegen 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_t
für Unicode / Multibyte-Zeichenfolgen ist veraltet: Soll ich bei Verwendung von UTF-8 wchar_t verwenden?