2017-05-10 7 views
-2

Ich möchte const char[] to unsigned char * zu übertragen.Fehler beim Versuch, static_cast <> const char [] zu unsigned char *

Ich verwende C++ Abgüsse (dh: static_cast):

unsigned char * txt = static_cast<unsigned char *>("AC"); 

Wenn ich die Anwendung zu erstellen ich die folgende Fehlermeldung erhalten:

error:invalid static_cast from type 'const char [3]' to type 'unsigned char *'

Wenn ich C wie Abgüsse:

unsigned char * txt = (unsigned char *)"AC"; 

Ich bekomme keine Kompilierung Fehler und das Programm läuft perfekt.

Ich muss C++ - Umwandlungen verwenden, um Laufzeitfehler zu vermeiden. Wie kann ich const char [3] in unsigned char * mithilfe von C++ - Umwandlungen umwandeln?

+1

Warum Sie nicht-const werfen wollen? –

+0

Das Umwandeln von 'const char *' in 'char *' selbst in C führt schließlich zu Undefined Behavior. Vermeiden Sie das. –

+1

"Ich muss C++ - Umwandlungen verwenden, um Laufzeitfehler zu vermeiden" - zum Beispiel? –

Antwort

2

unsigned char* und const char[] sind nicht verwandte Typen, so dass static_cast<> nicht funktioniert. Und die Konstanz ist anders, daher ist ein const_cast<> erforderlich.

Correct Besetzung:

unsigned char* txt = reinterpret_cast<unsigned char*>(const_cast<char*>("AC")); 

Bitte beachten Sie, dass Sie nicht durch diese unsigned char* txt Zeiger schreiben können, weil C++ Stringliterale ("AC" hier) sind unveränderlich und oft in Nur-Lese-Speicher gespeichert.

Siehe const_cast<>:

Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior.

+0

Ich verwende nur 'txt' zum Vergleich, also muss ich es nicht ändern. Vielen Dank ! –

+2

@LoayAshmawy ..aber beachten Sie, dass, sobald Sie 'reinterpret_cast' und' const_cast' verwenden, Ihre Prämisse "C++ Casts verwenden, um Laufzeitfehler zu vermeiden" nicht mehr hält und in Bezug auf Sicherheit können Sie auch die C-Style-Umwandlung verwenden . Allerdings würde ich immer noch die C++ - Casts verwenden, weil es deutlich Ihre Absicht im Code ausdrückt, es ist ein bisschen: "Ich frage nach Ärger, aber ich weiß, was ich hier mache" – user463035818

+2

@LoayAshmawy Wenn du gehst um es zum Vergleich zu benutzen, gibt es keinen Grund (und keinen Grund), die Konstanz wegzuzaubern. –

Verwandte Themen