631 Stimmen

Wann ist reinterpret_cast zu verwenden?

Ich bin etwas verwirrt über die Anwendbarkeit von reinterpret_caststatic_cast . Nach dem, was ich gelesen habe, sind die allgemeinen Regeln statische Besetzung zu verwenden, wenn die Typen zur Kompilierzeit interpretiert werden können, daher das Wort static . Dies ist der Cast, den der C++-Compiler intern auch für implizite Casts verwendet.

reinterpret_cast s sind in zwei Szenarien anwendbar:

  • Ganzzahlige Typen in Zeigertypen umwandeln und umgekehrt
  • einen Zeigertyp in einen anderen umwandeln. Die allgemeine Vorstellung, die ich bekomme, ist, dass dies unportabel ist und vermieden werden sollte.

Wo ich ein wenig verwirrt bin, ist eine Verwendung, die ich benötige, ich rufe C++ von C und der C-Code muss auf das C++-Objekt halten, so dass im Grunde hält es eine void* . Welcher Cast sollte verwendet werden, um zwischen den void * und den Klassentyp?

Ich habe die Verwendung von beidem gesehen static_cast y reinterpret_cast ? Doch nach dem, was ich gelesen habe, scheint es static besser ist, da der Cast zur Kompilierzeit erfolgen kann? Obwohl es heißt, man solle reinterpret_cast um von einem Zeigertyp in einen anderen umzuwandeln?

30 Stimmen

reinterpret_cast findet nicht zur Laufzeit statt. Beides sind Anweisungen zur Kompilierzeit. Von de.cppreference.com/w/cpp/language/reinterpret_cast : "Im Gegensatz zu static_cast, aber wie const_cast, wird der Ausdruck reinterpret_cast nicht in CPU-Anweisungen kompiliert. Es handelt sich um eine reine Compilerdirektive, die den Compiler anweist, die Bitfolge (Objektdarstellung) des Ausdrucks so zu behandeln, als hätte sie den Typ new_type."

0 Stimmen

@HeretoLearn, ist es möglich, die relevanten Codestücke aus der *.c und *.cpp Datei hinzuzufügen? Ich denke, das kann die Aussagekraft der Frage verbessern.

-21voto

dirkgently Punkte 104289

Lesen Sie die FAQ ! Die Speicherung von C++-Daten in C kann riskant sein.

In C++ kann ein Zeiger auf ein Objekt umgewandelt werden in void * ohne Gipsabdrücke. Umgekehrt ist das aber nicht der Fall. Sie bräuchten eine static_cast um den ursprünglichen Zeiger zurückzubekommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X