2009-10-22 2 views

Antwort

161

C++ - Style-Casts werden vom Compiler überprüft. C Casts sind nicht und können zur Laufzeit nicht

auch, C++ Casts kann leicht durchsucht werden, während es wirklich schwer für c-Stil suchen werfen

Ein weiterer großer Vorteil ist, dass der 4 verschiedenen C++ Stil Guss drückt die Absicht des Programmierers deutlicher aus.

Wenn ich C++ schreibe, würde ich fast immer die C++ - über den C-Stil verwenden.

+46

Die einzigen Umwandlungen, die zur Laufzeit fehlschlagen können, sind 'dynamic_cast's. –

+8

C++ reinterpret_cast (U) kann zur Laufzeit ziemlich ähnlich wie C-Style-Casts können, und sie sind alle ganz anders als die dynamische (U) schlägt fehl. –

+11

˗1 normal C Cast '(int) etwas kann nicht fehlschlagen - entweder Sie werfen auf Int oder Compiler-Fehler. –

2

Da es viele verschiedene Arten von Casting gibt, jede mit unterschiedlicher Semantik, erlaubt static_cast <> Ihnen zu sagen "Ich mache eine legale Konvertierung von einem Typ zu einem anderen" wie von Int zu Double. Ein einfacher C-Style-Cast kann eine Menge Dinge bedeuten. Bist du im Casting? Uminterpretieren Sie einen Zeiger?

12

Siehe A comparison of the C++ casting operators.

Die Verwendung der gleichen Syntax für eine Vielzahl verschiedener Casting-Operationen kann jedoch die Absicht des Programmierers unklar machen.

Darüber hinaus kann es schwierig sein, eine bestimmte Art von Besetzung in einer großen Codebasis zu finden.

Die Allgemeingültigkeit des C-Stils kann für Situationen übertrieben sein, in denen nur eine einfache Konvertierung erforderlich ist. Die Möglichkeit, zwischen mehreren verschiedenen Casting-Operatoren mit unterschiedlichem Leistungsgrad zu wählen, kann verhindern, dass Programmierer unbeabsichtigt in einen falschen Typ umwandeln.

129

Kurz:

  1. static_cast<>() gibt Ihnen eine Kompilierung Fähigkeit überprüft, hat C-Style Guss nicht.
  2. static_cast<>() ist besser lesbar und leicht zu erkennen überall in einem C++ - Quellcode, C_Style Cast is'nt.
  3. Absichten werden viel besser mit C++ - Casts vermittelt.

Mehr Erläuterung:

Die statische Guss führt Konvertierungen zwischen kompatible Typen. Es ist ähnlich dem C-Style-Cast, ist aber restriktiver. Zum Beispiel würde der C-Style-Cast einem Ganzzahlzeiger erlauben, auf ein Zeichen zu zeigen.

char c = 10;  // 1 byte 
int *p = (int*)&c; // 4 bytes 

Da dies führt zu einem 4-Byte-Datentyp zeigt auf 1 Byte des zugeordneten Speichers, wird entweder diesen Zeiger Schreiben veranlassen, einen Laufzeitfehler oder werden einige benachbarten Speicherüberschreiben.

*p = 5; // run-time error: stack corruption 

Im Gegensatz zum C-Casts, wird die statische Besetzung der Compiler erlauben zu überprüfen, ob die Zeiger und pointee Datentypen kompatibel sind, was der Programmierer ermöglicht diese falsche Zeigerzuweisung während der Kompilierung zu fangen.

int *q = static_cast<int*>(&c); // compile-time error 

Sie können diese Seite auch auf C++ auf weitere Erklärung überprüfen wirft: Click Here

+9

Ich denke, anstelle von "4-Byte-Zeiger" Sie gemeint "Zeiger auf 4-Byte-Datentyp" – iheanyi

10
struct A {}; 
struct B : A {}; 
struct C {}; 

int main() 
{ 
    A* a = new A;  

    int i = 10; 

    a = (A*) (&i); // NO ERROR! FAIL! 

    //a = static_cast<A*>(&i); ERROR! SMART! 

    A* b = new B; 

    B* b2 = static_cast<B*>(b); // NO ERROR! SMART! 

    C* c = (C*)(b); // NO ERROR! FAIL! 

    //C* c = static_cast<C*>(b); ERROR! SMART! 
} 
+3

Könnten Sie bitte mehr Ihre Antwort erarbeiten, ein wenig mehr Beschreibung über die Lösung, die Sie bereitstellen? – abarisone

+0

Ich denke, die Antwort zeigt, dass "static_casts" Typumwandlungen überprüft, um sicherzustellen, dass sie entlang gültiger Pfade im Hierarchiediagramm sind. In diesem speziellen Beispiel ist das Umwandeln von A * nach B * oder B * nach A * zulässig, da A und B einen Pfad in dem hierarchischen Graphen bilden. C * befindet sich nicht auf dem Pfad, sodass static_cast einen Fehler bei der Kompilierung verursacht. Hinweis: Es kann erwähnenswert sein, dass das Umwandeln von A * nach B * in Abhängigkeit vom zugrunde liegenden Objekt zur Laufzeit zu NULL mit dynamic_cast führen kann. –

2

static_cast prüft bei der Kompilierung, dass die Umwandlung nicht zwischen offensichtlich unvereinbar Typen ist. Im Gegensatz zu dynamic_cast wird zur Laufzeit keine Überprüfung auf Kompatibilität der Typen durchgeführt. Auch static_cast Konvertierung ist nicht unbedingt sicher.

static_cast wird verwendet, um vom Zeiger zur Basisklasse zum Zeiger auf abgeleitete Klasse oder zwischen nativen Typen, wie enum zu int oder float zu int, zu konvertieren. Der Benutzer static_cast muss sicherstellen, dass die Konvertierung sicher ist.

Der C-Style-Cast führt keine Überprüfung durch, weder beim Kompilieren noch zur Laufzeit.

1

Ein großer Beitrag Besetzungen in C/C++ zu erklären, und was C-Casts wirklich tut: https://anteru.net/blog/2007/12/18/200/index.html

C-Style Gießen, mit der (Typ) Variable Syntax. Das schlechteste aller Zeiten erfunden. Dies versucht die folgenden Würfe, die in dieser Reihenfolge zu tun: (siehe auch C++ Standard 5.4 expr.cast Absatz 5)

  1. const_cast
  2. static_cast
  3. static_cast gefolgt von const_cast
  4. reinterpret_cast
  5. reinterpret_castfollowed von const_cast