Diese Antwort und die ihr hinzugefügten Kommentare zeigen eine Möglichkeit, mehrere Compiler-Warnungen mithilfe von #pragma
Direktiven zu deaktivieren .
Warum sollte man das tun wollen? Normalerweise gibt es die Warnungen aus einem bestimmten Grund, und ich habe immer das Gefühl, dass sie gute Gründe sind. Gibt es einen "gültigen Fall", in dem Warnungen deaktiviert werden sollten? Im Moment fällt mir nichts ein, aber vielleicht bin das nur ich.
Antworten:
Ich hatte bisher nur eine Situation, in der ich eine Warnung deaktiviert habe. Ich betrachte Warnungen als Fehler, daher würde ich sie normalerweise nicht mit Warnungen veröffentlichen. Bei der Entwicklung einer API bei einem Kunden stellte sich jedoch das Problem, dass eine Methode, die in einer Migrationsphase von einer Anwendung benötigt wurde und von keiner anderen Anwendung verwendet werden sollte, in die Bibliothek aufgenommen werden musste.
Die beste Möglichkeit, allen Benutzern der API mitzuteilen, dass sie diese Methode nicht aufrufen sollten, bestand darin, sie als veraltet zu markieren. Dies bedeutete jedoch, dass der eine gültige Anwendungsfall als Kompilierungswarnung markiert wurde.
Eric Lippert hat einige Posts über Warnungen geschrieben, in denen Sie Informationen darüber finden, wie das Compilerteam über Warnungen denkt.
Interne Felder von Internen Typen
Nicht verwendete Anweisungen sind nicht mit Warnungen versehen
quelle
Hier sind einige Warnungen, in denen die Dokumentation Gründe dafür enthält, warum Sie sie möglicherweise deaktivieren möchten:
Andere Beispiele sind Warnungen zur Verwendung veralteter Methoden, wenn Sie wissen, dass Sie immer noch die alte Methode verwenden möchten oder private Mitglieder haben möchten, die nie lokal gelesen werden, sondern nur mit Reflektion.
Meiner Erfahrung nach muss C # Warnungen weniger deaktivieren als andere Sprachen wie C ++. Dies liegt vor allem daran, dass Eric Lippert in seinem Blog sagt , dass er versucht, "Warnungen nur für Situationen zu reservieren, in denen wir mit fast Sicherheit sagen können, dass der Code fehlerhaft, irreführend oder nutzlos ist".
quelle
Ein Beispiel in C, das mir regelmäßig begegnet:
Das Argument ist nur auf einigen Plattformen relevant, aber auf solchen, auf denen es nicht relevant ist, wird sich mein Compiler beschweren, und da ich Warnungen in Fehler umgewandelt habe, wird verhindert, dass sie erstellt werden.
Das Konvertieren von Warnungen in Fehler erfordert eine Escape-Luke für "nicht diese, ich weiß es in diesem Fall besser als der Compiler".
quelle
Viele unverzichtbare Java-Bibliotheken wurden nie aktualisiert, um unsichere Typecasts zu vermeiden. Das Unterdrücken dieser Warnungen ist erforderlich, damit andere wichtigere Warnungen bemerkt und korrigiert werden.
quelle
Ich mache Embedded-Arbeiten und erinnere mich an ein oder zwei Male, als ich Warnungen deaktiviert habe, weil ich etwas gemacht habe, das für den Compiler nutzlos aussah, aber tatsächlich reale Auswirkungen auf die Hardware hatte.
Das einzige andere Mal, wenn ich an Codebasen mit unterschiedlichen Vorstellungen einer Datenstruktur arbeite (z. B. wie man Bytearrays darstellt - char oder unsigned char?). In diesen Fällen kann es sein, dass ich die Warnungen deaktiviere, weil die Alternative darin besteht, Tage damit zu verbringen, den Code zu durchlaufen und entweder einen Teil zu ändern oder Hunderte von Casts einzugeben.
quelle
Es gibt einige Gründe, Compiler-Warnungen selektiv zu deaktivieren, auch für Projekte, die nach Best Practices streben.
Compiler behandeln Warnungen auf subtile Weise. Geben Sie falsch positive Warnungen aus, die sich nicht auf andere Compiler auswirken. In diesem Fall ist es möglicherweise sinnvoll, die Warnung für diese Compiler zu deaktivieren, anstatt gültigen Code zu bearbeiten, um eine falsch-positive Warnung zu unterdrücken, die nur bestimmte Compiler betrifft, insbesondere ältere Compiler, die möglicherweise ohnehin nicht mehr unterstützt werden.
Einige Warnungen im Zusammenhang mit der Codehygiene (toter Code, doppelter Text bedingter Anweisungen, Vergleiche, die die Typgrenzen überschreiten) können ignoriert werden, da sie harmlos sind und vom Compiler optimiert werden.
Das Generieren von Code, der diese harmlosen Warnungen nicht auslöst, ist natürlich ebenfalls eine Option, kann aber mehr Probleme bereiten als es sich lohnt.
Möglicherweise verwenden Sie eine bekannte qsort- oder md5-Prüfsummenimplementierung, die in Ihrem Projekt enthalten ist. Der Code wird von vielen Projekten verwendet und funktioniert bekanntermaßen gut. Es kann jedoch einige wählerische Warnungen geben, die Sie normalerweise für Ihren eigenen Code korrigieren.
Jedoch für externen Code, kann es weniger Aufwand sein, nur die Warnung abzuschalten (vorausgesetzt , seine definitiv ist harmlos).
Auch wenn beispielsweise GCC / Clang unterstützt
-isystem
, gibt es Fälle, in denen Unterschiede in den Systemheader Warnungen verursachen, die ignoriert werden können (möglicherweise hat eine Funktion auf einem System einen vorzeichenbehafteten Rückgabewert, auf einem anderen jedoch keinen) und-Wsign-compare
Warnungen auslösen .Ein anderer Fall können Makros sein, die in System-Headern definiert sind. Sie können die Makros kopieren und in Ihren eigenen Code einfügen, um sie zu ändern, aber alles in allem ist es besser, sich keine Sorgen um die Verwaltung von Makros aus Bibliotheken von Drittanbietern zu machen um die Warnung zu beruhigen (vielleicht fehlt dem Makro eine Besetzung, die
-Wsign-conversion
z. B. verursacht ).Sie können vor nicht verwendeten Parametern warnen, wenn Sie jedoch eine gesamte Bibliothek in einer einzelnen Datei stubben, die nur Stub-Funktionen enthält - es ist nicht hilfreich,
(void)arg1; (void)arg2; (void)arg3; ...
den Rumpf jeder Stub-Funktion zu erzwingen .Besser einfach
-Wunused-parameter
in diesem Fall unterdrücken .Beachten Sie, dass in allen diesen Beispielen seine die Warnungen angenommenen Deaktivierung ist nicht wirklich Fehler gehen zu verbergen, zum Beispiel:
-Wredundant-decls
,-Wunused-parameter
,-Wdouble-promotion
, vielleicht-Wpedantic
... und dass Sie wissen , was Sie tun!quelle
Gültig oder nicht, manchmal wird die Anweisung "Warnungen als Fehler behandeln" auf dem Build-Server umgangen.
Ansonsten fällt mir auch nichts ein. Deaktivierte Warnungen sind normalerweise ein Zeichen für einen "hässlichen Hax" ...
quelle
Als wir das letzte Mal bestimmte Warnungen deaktiviert haben, war dies darauf zurückzuführen, dass uns ein Praktikant einen schlechten Code hinterlassen hatte. Ich habe es viel besser funktionieren, mit klaren Konvertierungsgrenzen, die die zufällige Datendarstellung ersetzen.
In der Zwischenzeit mussten wir es kompilieren und wollten, dass die Option "Warnungen sind Fehler" aktiviert ist. Daher haben wir einige der Warnungen unterdrückt.
quelle
Derzeit ist die einzige Warnung, die ich jemals ignoriere
Weil Microsoft die C ++ - Spezifikation nicht implementiert (die Dokumentation sagt sogar, dass dies nicht der Fall ist!) Und es Funktionen erlaubt, bestimmte Würfe zu deklarieren, und alle Funktionen können nur entweder throw () oder throw (...), dh nichts oder alles, werfen.
In HelpViewer 1.1:
quelle