2009-08-13 5 views

Antwort

24

GCC hat die Option -Wold-style-cast, die Sie warnt, wenn es C-artige Umwandlungen findet.

+0

Aber ich bin mit Visual C++ (MFC) :( –

+0

Vielleicht möchten Sie die Visual C++ Compiler-Schalter zu überprüfen, es zu sehen, ob diese Warnung ein auszuschalten ist oder wenn sie eine, die Sie bestimmte Sperren angeben Warnungen Wenn es einen solchen Schalter nicht gibt, können Sie die Warnung mit einem Pragma in den Dateien deaktivieren, die das Vergehen verursachen. Ich habe mit mit Visual C++ verwandt, um einige Warnung über die Länge der STL-Namen bei dem Kompilieren zu deaktivieren – Glenn

7

Ich weiß nicht von einem Compiler-Schalter, der diese oder etwas anderes in Visual Studio integriert meldet.

Hier ist jedoch eine Perl script, die Ihren Quellbaum durchsuchen und alle C-Style-Umwandlungen in Ihrer Quelle finden wird. Es funktioniert ziemlich gut, um sie aufzuspüren.

6

Leider gibt es in Visual C++ keine Compiler-Warnung, die auf diese Umwandlungen hinweist (zumindest nicht eine, die ich kenne), obwohl PC-Lint eine Warnung/Notiz anzeigt, die Sie warnt, wenn Sie sie verwenden eine alte Besetzung. Hängt davon ab, ob du das Geld für PC-Lint ausgeben willst - meiner Meinung nach ist es definitiv für all die Probleme wert, die du damit finden kannst ...

-9

Warum brauchst du das? Willst du sie alle loswerden?

C-Style Casts für grundlegende Typen wie (double) sind sicher und sieht viel besser als static_cast<double>(). Ich persönlich bevorzuge diesen Stil.

Im Falle von polymorphen Klassen ist das Problem der C-Style-Modelle imho stark übertrieben. Es kann nur ein Problem sein, wenn Sie Mehrfachvererbung verwenden und Cros Casting durchführen müssen. Standardmäßig werden C-artige Umwandlungen dort nicht funktionieren. Aber in den meisten Fällen funktioniert () genau wie static_cast<>() und ich würde keine Zeit verschwenden, sie zu ersetzen. Wie dem auch sei, für polymorphe Typen verwende ich C++ - Style-Casts, wenn ich neuen Code schreibe oder etwas ändere.

UPDATE:

Jungs, es scheint, dass ich meine Meinung zum Ausdruck nicht so klar. Ja, ich kenne die Theorie: C++ - Besetzung ist gut, C-Besetzung ist böse. Diese Regel (und die meisten anderen) wird benötigt, um Neulinge aus C++ zu retten. Aber es bedeutet nicht, dass Sie immer folgen müssen.

Mein Punkt ist, dass C-Style-Casts nicht so schrecklich sind. Wenn Sie eine Funktion wie

int convertFooToBar(double i_foo) 

schreiben, gibt es keine Gründe, C++ - Casts bei der Umsetzung. Sie sind nicht sicherer als (int), sehen aber chaotisch aus. Casting ist in diesem Fall nicht schwierig. Es ist überhaupt nichts Schlechtes oder Schwieriges beim Casting: Manchmal sind Casts natürlich.

Über die Suche: Ich kann mich nicht daran erinnern, dass ich in den letzten 10 Jahren nach einer Cast-Anweisung gesucht habe, obwohl ich täglich mehrere Millionen Zeilen älteren C++ - Codes aufbewahre. Ich erinnere mich nicht einmal an ein ernsthaftes Problem wegen falschem Casting.

Ursprüngliche Frage ist über das Ersetzen bereits geschriebener C-artiger Modelle. Also, meine Antwort lautet:

Ja, C++ - Style-Casts sind besser und sicherer als C-Style-Einsen. Aber es bedeutet nicht, dass Sie für alte in Ihrem Code suchen und versuchen müssen, loszuwerden von ihnen allen. Eigentlich ist es kein wirkliches Problem. Verschwenden Sie nicht Ihre Zeit.Sie können es für das Suchen und Löschen von veraltetem Code ausgeben. Es wäre nützlicher für Ihre Codebasis.

+6

Obwohl es wie ein static_cast funktioniert, besteht das Problem darin, dass es beim Ändern von umgebendem Code stillschweigend wie ein reinterpret_cast arbeitet, ohne dass Sie das, was Sie wollen, richtig ausdrücken, und der Compiler ist frei, was auch immer zu tun Besetzung ist die beste Lösung ein umgebender Code, und dein C-Cast ändert seine Bedeutung und bricht deinen Code. Und natürlich ist ein Bonusproblem das Thema dieser Frage: Sie sind unmöglich zu suchen. Es ist ein bisschen peinlich, die verwendeten Casts nicht finden zu können, besonders wenn sie so fehleranfällig sind. – jalf

+14

und schließlich ist es * absichtlich *, dass sie hässlich sind. Casts * sind * ein hässlicher Trick. Sie sollten hässlich aussehen, um klar zu machen, dass sie passieren, und um Sie davon abzuhalten, sie zu missbrauchen. ;) – jalf

+10

Dieses Problem, bei dem der Benutzer die Umwandlungen in seinem Code nicht finden kann, ist ein Grund, die C++ - Umwandlungen zu bevorzugen. – JohnMcG