coding-style style - C++Cast Syntaxstile




reinterpret_cast static_cast (9)

Gehen Sie für C ++ - Stil, und im schlimmsten Fall sind die hässlichen ausführlichen Code - Schnipsel, die die explizite Typumwandlung von C ++ enthielten, eine ständige Erinnerung an das, was wir alle wissen (z. B. explizites Casting ist schlecht - das führt zur Prägung von Kraftausdrücken). Gehen Sie nicht mit C ++ - Stil, wenn Sie die Kunst des Verfolgens von Laufzeitfehlern beherrschen wollen.

Eine Frage im Zusammenhang mit Regular Cast vs. Static_cast vs. Dynamic_cast :

Welche Cast-Syntax bevorzugen Sie in C ++?

  • C-artige Cast-Syntax: (int)foo
  • C ++ - artige Syntax: static_cast<int>(foo)
  • Konstruktorsyntax: int(foo)

Sie können nicht zu genau den gleichen Anweisungen übersetzen (tun sie?), Aber ihre Wirkung sollte gleich sein (richtig?).

Wenn Sie nur zwischen den integrierten numerischen Typen umwandeln, finde ich die Cast-Syntax im C ++ - Stil zu ausführlich. Als früherer Java-Coder tendiere ich dazu, C-Style-Cast-Syntax zu verwenden, aber mein lokaler C ++ - Guru besteht darauf, Konstruktorsyntax zu verwenden.

Was denken Sie?


Es ist die beste Vorgehensweise, C-Style-Casts nie aus drei Gründen zu verwenden:

  • Wie bereits erwähnt, wird hier keine Überprüfung durchgeführt. Der Programmierer kann einfach nicht wissen, welcher der verschiedenen Casts verwendet wird, was eine starke Typisierung schwächt
  • Die neuen Modelle sind absichtlich optisch auffällig. Da Casts oft eine Schwachstelle im Code offenbaren, wird argumentiert, dass das Erstellen von Casts im Code eine gute Sache ist.
  • Dies gilt insbesondere dann, wenn mit einem automatisierten Werkzeug nach Güssen gesucht wird. C-artige Modelle zuverlässig zu finden, ist nahezu unmöglich.

Wie Palm3D bemerkt:

Ich finde C ++ - Stil Cast Syntax zu ausführlich.

Dies ist aus den oben genannten Gründen beabsichtigt.

Die Konstruktorsyntax (offizieller Name: function-style cast) ist semantisch die gleiche wie die C-Style-Umwandlung und sollte (mit Ausnahme von Variableninitialisierungen bei der Deklaration) aus denselben Gründen vermieden werden. Es ist fraglich, ob dies auch für Typen gelten soll, die benutzerdefinierte Konstruktoren definieren, aber in Effective C ++ argumentiert Meyers, dass Sie selbst in diesen Fällen davon absehen sollten, sie zu verwenden. Um zu veranschaulichen:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

Der static_cast hier ruft eigentlich den Konstruktor auto_ptr .


Wir verwenden derzeit C-Style Casts überall. Ich habe die andere Casting-Frage gestellt , und ich sehe jetzt den Vorteil, stattdessen static_cast zu verwenden, wenn es aus keinem anderen Grund als "greppable" ist (ich mag diesen Begriff). Ich werde wahrscheinlich anfangen, das zu benutzen.

Ich mag den C ++ - Stil nicht; Es sieht zu sehr nach einem Funktionsaufruf aus.


C-artige Cast-Syntax, keine Fehlerprüfung. C ++ - artige Syntax, führt einige Überprüfungen durch. Wenn Sie static_cast verwenden, auch wenn es keine Überprüfung durchführt, wissen Sie zumindest, dass Sie hier vorsichtig sein sollten.


Die Konstruktorsyntax. C ++ ist OO, Konstruktoren existieren, ich benutze sie. Wenn Sie das Bedürfnis haben, diese Umwandlungsstellen zu kommentieren, sollten Sie es für jeden Typ tun, nicht nur für die eingebauten. Vielleicht verwenden Sie das 'explicit' Schlüsselwort für Conversion-Ctors, aber die Client-Syntax ahmt genau das nach, was die ctor-Syntax für integrierte Typen tut. Gut zu sein, das mag wahr sein, aber was für eine große Überraschung, dass das Tippen von mehr Zeichen die Suche erleichtert. Warum diese als besonders behandeln? Wenn Sie mathematische Formeln mit vielen int / unsigned / ... zu und von double / float - Grafiken schreiben - und Sie jedes Mal einen static_cast schreiben müssen, wird das Aussehen der Formel überladen und ist sehr unlesbar. Und es ist sowieso ein harter Kampf, denn oft wirst du konvertieren, ohne es zu merken. Für Downcasting Pointer benutze ich den static_cast, da natürlich no ctor standardmäßig nicht existiert.


In Bezug auf dieses Thema befolge ich die Empfehlungen von Scott Meyers ( Effektiver C ++ , Punkt 2: Lieber C ++ - Stile bevorzugen).

Ich stimme zu, dass die C ++ - Darstellungsform ausführlich ist, aber das ist es, was ich an ihnen mag: Sie sind sehr einfach zu erkennen und sie machen den Code leichter lesbar (was wichtiger ist als das Schreiben).

Sie zwingen Sie auch, darüber nachzudenken, welche Art von Besetzung Sie benötigen, und die richtige zu wählen, um das Risiko von Fehlern zu reduzieren. Sie helfen Ihnen auch, Fehler während der Kompilierung anstatt zur Laufzeit zu erkennen.


Laut Stroustrup :

Die "New-Style-Casts" wurden eingeführt, um Programmierern die Möglichkeit zu geben, ihre Absichten deutlicher zu formulieren und den Compiler mehr Fehler zu erfassen.

Also wirklich, es ist für die Sicherheit, wie es zusätzliche Überprüfung der Kompilierzeit tut.


Ich verwende static_cast aus zwei Gründen.

  1. Es ist explizit klar, was passiert. Ich kann das nicht lesen, ohne zu bemerken, dass es eine Besetzung gibt. Mit C-Style Casts können Sie Ihr Auge ohne Pause passieren.
  2. Es ist einfach, nach jedem Ort in meinem Code zu suchen, an den ich mich bewerbe.

Mein Compiler druckt 9876543210 aus, wenn ich diesen Code ausführen.

#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}

Wie erwartet. Das while( x-- > 0 ) bedeutet eigentlich while( x > 0) . Das x-- post dekrementiert x .

while( x > 0 ) 
{
    x--;
    std::cout << x;
}

ist eine andere Art, das Gleiche zu schreiben.

Es ist schön, dass das Original zwar aussieht als "x geht auf 0".





c++ coding-style casting