Einzelner Warnfehler deaktivieren

Lesezeit: 6 Minuten

Benutzer-Avatar
Plätzchen

Gibt es eine Möglichkeit, nur eine einzelne Warnzeile in einer cpp-Datei mit Visual Studio zu deaktivieren?

Wenn ich beispielsweise eine Ausnahme abfange und sie nicht behandle, erhalte ich den Fehler 4101 (nicht referenzierte lokale Variable). Gibt es eine Möglichkeit, dies nur in dieser Funktion zu ignorieren, aber ansonsten in der Kompilierungseinheit zu melden? Im Moment lege ich #pragma warning (disable : 4101) am Anfang der Datei, aber das schaltet es offensichtlich nur für die gesamte Einheit aus.

  • Wenn Sie nur den Typ angeben und die Ausnahme nicht benennen, wird keine Warnung ausgegeben. Z.B catch (const std::exception& /* unnamed */) {.... }. Es beantwortet zwar nicht deine Frage, könnte aber dein Problem lösen.

    – Sjoerd

    23. August 2011 um 10:10 Uhr

  • Google sucht nach “Wie man -Wunused-Ergebnis in C++ unterdrückt” führen Sie hierher, also ist hier die Antwort für nur diesen speziellen Fall: stackoverflow.com/a/63512122/4561887.

    – Gabriel Staples

    20. August 2020 um 20:13 Uhr


#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

  • @Cookie: Ja, es funktioniert für jeden Code, der den Compiler durchläuft.

    – Matteo Italien

    23. August 2011 um 10:22 Uhr

  • Eine neuere, prägnantere Antwort finden Sie unten in der Antwort von Daniel Seither.

    – Dan Nissenbaum

    13. Juni 2016 um 20:45 Uhr

  • clang scheint dieses Pragma nicht zu unterstützen, aber Sie können den gleichen Effekt mit erzielen #pragma clang diagnostic push, #pragma clang diagnostic ignored "-Wunused-variable"und #pragma clang diagnostic pop. Sehen “Steuern der Diagnose über Pragmas” im Clang-Benutzerhandbuch

    – Rapunzel

    31. August 2016 um 14:44 Uhr


  • Da ich diese Funktion selten verwende, lande ich normalerweise auf dieser Seite, um mich an die Syntax zu erinnern. Ich habe es einfach um einen Aufruf einer veralteten Funktion gelegt, die möglicherweise nie aktualisiert wird, damit mich die Warnung in den Compiler-Listen, die ich religiös scanne, nicht stört.

    – David A. Gray

    4. Dezember 2016 um 7:07 Uhr

  • Für Visual Studio lautet das Befehlszeilenargument /wd4101. Beachten Sie, dass es nicht das Normale gibt : zwischen dem Flag und der Zahl, und Sie können keine durch Kommas getrennte Liste von Zahlen erstellen. Für andere Compiler ist es könnte sein /nowarn:4101 stattdessen.

    – Jesse Chisholm

    24. Mai 2017 um 18:15 Uhr


Benutzer-Avatar
Daniel Seither

Wenn Sie eine Warnung nur in einer einzigen Codezeile (nach der Vorverarbeitung) unterdrücken möchten[1]du kannst den … benutzen suppress Warnungsspezifizierer:

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

Für eine einzelne Codezeile funktioniert dies genauso wie das Schreiben des Folgenden:

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

[1] Andere haben in Kommentaren unten angemerkt, dass, wenn die folgende Anweisung eine #include-Anweisung ist, die #pragma warning(suppress: 4101)-Anweisung die Warnung nicht für jede Zeile in der Header-Datei effektiv unterdrücken würde. Wenn man das beabsichtigen würde, müsste man stattdessen die Push/Disable/Pop-Methode verwenden.

  • Sehr hilfreich! Leider funktioniert es nicht für eine einzelne Zeile, die einen Header enthält, der die Warnung generiert.

    – Marko Popović

    1. März 2016 um 11:02 Uhr

  • @MarkoPopovic: Die suppress Bezeichner arbeitet auf einem einzigen, vorbearbeitet Codezeile. Wenn die folgende Zeile #pragma warning(suppress: ...) ist ein #include Direktive (die die durch ihren Parameter referenzierte Datei in die aktuelle Kompilationseinheit erweitert), gilt der Effekt nur für die erste Zeile dieser Datei. Dies sollte offensichtlich sein, da Warnungen vom Compiler generiert werden. Der Compiler arbeitet mit vorverarbeitetem Code.

    – Inspektionsfähig

    19. Dezember 2016 um 11:49 Uhr

  • @IInspectable In diesem Fall würde ich es a nennen nachbearbeitet Codezeile. vorbearbeitet bedeutet, dass es noch nicht vom Präprozessor übersetzt wurde.

    – void.pointer

    17. September 2019 um 16:04 Uhr

  • @voi: Die “-ed” Ende bedeutet das Partizip Perfekt. Es wird verwendet, um auszudrücken, dass etwas in der Vergangenheit zu Ende gegangen ist. EIN “vorverarbeitet” Zeile ist eine Zeile, die vollständig verarbeitet wurde.

    – Inspektionsfähig

    2. November 2019 um 12:42 Uhr

  • Diese Kommentare verwirrten mich ein wenig, wenn jemand in dasselbe Boot fällt, was sie meinen #pragma warning(suppress: 4101) \n #include "wholeFile.h wird Fehler nicht im gesamten Header unterdrücken (offensichtlich, aber Kommentare weisen normalerweise auf nicht offensichtliches Verhalten hin, daher die Verwirrung) Sie können dies innerhalb des Headers selbst verwenden, kein Problem

    – Anne Quinn

    3. August 2021 um 13:46 Uhr


#pragma Push/Pop sind oft eine Lösung für diese Art von Problemen, aber warum entfernen Sie in diesem Fall nicht einfach die nicht referenzierte Variable?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

  • Dies ist keine Antwort auf die Frage. Zugegeben, dies könnte das Problem von OP lösen, hilft aber zukünftigen Lesern nicht mit einer ähnlichen Frage: “Wie schalte ich eine bestimmte Warnung für einen bestimmten Teil meines Codes aus?”

    – Sjoerd

    23. August 2011 um 10:16 Uhr

  • @Sjoerd: Drei Leute haben bereits die “offizielle Frage” beantwortet, die andere Leute suchen können, also habe ich stattdessen versucht, zwischen den Zeilen zu lesen und sein eigentliches Problem zu lösen (eine Minute nach Ihrem Kommentar angekommen :P).

    – Matteo Italien

    23. August 2011 um 10:18 Uhr


  • @Sjoerd als zukünftiger Leser bestätige ich, dass diese Antwort mir tatsächlich geholfen hat.

    – Molot

    7. Juli 2015 um 11:31 Uhr

  • @Mołot: Als ehemaliger Autor bin ich froh, dass es geholfen hat. =)

    – Matteo Italien

    7. Juli 2015 um 11:38 Uhr

  • 10 Jahre später verwende ich immer noch keine Ausnahmen … Sehr oft kompiliere ich mit der (cl.exe) /kernel schalten.

    – Chef Gladiator

    21. März 2021 um 9:58 Uhr


Benutzer-Avatar
scharfer Zahn

Benutzen #pragma warning ( push )dann #pragma warning ( disable )geben Sie dann Ihren Code ein und verwenden Sie ihn #pragma warning ( pop ) wie hier beschrieben:

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 

Benutzer-Avatar
A876

Beispiel:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

Dieses Pragma gilt für C++ beginnend mit Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

Das Pragma ist NICHT gültig für C# über Visual Studio 2005 bis Visual Studio 2015.
Fehler: „Deaktivierung oder Wiederherstellung erwartet“.
(Ich schätze, sie sind nie zur Implementierung gekommen suppress …)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

C# benötigt ein anderes Format. Das würde so aussehen (funktioniert aber nicht):

#pragma warning suppress 0642  // (suppress one error in the next line)

Anstatt suppressSie müssen disable und enable:

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

Das ist so hässlich, ich denke, es ist klüger, es einfach neu zu gestalten:

if (condition)
{
    // Do nothing (because blah blah blah).
}
else

Benutzer-Avatar
orion elenzil

Wie @rampion erwähnt hat, sind die Warnungen, wenn Sie sich in clang gcc befinden, namentlich und nicht nummeriert, und Sie müssen Folgendes tun:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

diese Info stammt von hier

Anstatt es über die Datei (oder sogar eine Header-Datei) zu legen, umschließen Sie einfach den betreffenden Code mit #pragma warning (push), #pragma warning (disable) und ein passendes #pragma warning (pop)wie gezeigt hier.

Obwohl es einige andere Optionen gibt, einschließlich #pramga warning (once).

1013370cookie-checkEinzelner Warnfehler deaktivieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy