Welcher Cast zu verwenden ist; static_cast oder reinterpret_cast?

8
%Vor%

Welcher Cast sollte verwendet werden, um von void* nach int* zu konvertieren und warum?

    
user963241 18.12.2010, 01:53
quelle

4 Antworten

13

static_cast vorausgesetzt, Sie wissen (durch das Design Ihres Programms), dass die Sache, auf die wirklich verwiesen wird, ein int ist.

static_cast wurde entwickelt, um eine implizite Konvertierung umzukehren. Du hast implizit in void* konvertiert, also kannst (und solltest) es zurück konvertieren mit static_cast wenn du weißt, dass du wirklich nur eine frühere Konvertierung rückgängig machst.

Mit dieser Annahme wird nichts neu interpretiert - void ist ein unvollständiger Typ, was bedeutet, dass es keine Werte hat, also interpretieren Sie zu keinem Zeitpunkt einen gespeicherten int-Wert "as void" oder einen gespeicherten "void value" als int. void* ist nur eine hässliche Art zu sagen: "Ich kenne den Typ nicht, aber ich gebe den Zeiger an jemanden weiter, der das tut."

reinterpret_cast , wenn Sie Details ausgelassen haben, die bedeuten, dass Sie tatsächlich Speicher mit einem anderen Typ als dem Typ lesen, mit dem Sie geschrieben haben, und beachten Sie, dass Ihr Code nur begrenzt übertragbar ist.

Übrigens gibt es nicht viele gute Gründe, einen void* -Zeiger in C ++ auf diese Weise zu verwenden. Callback-Interfaces im C-Stil können oft durch eine Template-Funktion (für alles, was der Standardfunktion qsort ähnelt) oder eine virtuelle Schnittstelle (für alles, was einem registrierten Listener ähnelt) ersetzt werden. Wenn Ihr C ++ - Code eine C-API verwendet, haben Sie natürlich nicht viel Auswahl.

    
Steve Jessop 18.12.2010, 02:04
quelle
1

In aktuellem C ++ können Sie in diesem Code reinterpret_cast like nicht verwenden. Für eine Umwandlung von void* in int* können Sie nur static_cast (oder die entsprechende C-Style-Besetzung) verwenden.

Für eine Konvertierung zwischen verschiedenen Funktionstyp-Zeigern oder zwischen verschiedenen Objekttyp-Zeigern müssen Sie reinterpret_cast verwenden.

In C ++ 0x ist reinterpret_cast<int*>(p) äquivalent zu static_cast<int*>(p) . Es ist wahrscheinlich in einem der nächsten WPs enthalten.

Es ist ein Missverständnis, dass reinterpret_cast<T*>(p) die Bits von p so interpretiert, als ob sie ein T* darstellen würden. In diesem Fall wird der Wert von p mit dem Typ p gelesen und dieser Wert wird dann in T* konvertiert. Ein tatsächliches type-pun , das die Bits von p direkt unter Verwendung der Repräsentation vom Typ T* liest, passiert nur, wenn Sie in einen Referenztyp umwandeln, wie in reinterpret_cast<T*&>(p) .

Soweit ich weiß, erlauben alle aktuellen Compiler reinterpret_cast von void* und verhalten sich äquivalent zu den entsprechenden static_cast , obwohl dies im aktuellen C ++ 03 nicht erlaubt ist. Die Menge an Code, der bei der Ablehnung gebrochen wird, macht keinen Spaß, daher gibt es keine Motivation für sie, dies zu verbieten.

    
Johannes Schaub - litb 18.12.2010 02:14
quelle
-1

Von der Semantik Ihres Problems würde ich mit Neuinterpretation gehen, weil Sie das tatsächlich tun.

    
Lagerbaer 18.12.2010 01:55
quelle

Tags und Links