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, wird der Fehler 4101 (nicht referenzierte lokale Variable) angezeigt. Gibt es eine Möglichkeit, dies nur in dieser Funktion zu ignorieren, es aber ansonsten in der Kompilierungseinheit zu melden? Im Moment habe ich #pragma warning (disable : 4101)
oben in die Datei eingefügt, aber das schaltet sie offensichtlich nur für die gesamte Einheit aus.
c++
visual-c++
warnings
pragma
Plätzchen
quelle
quelle
catch (const std::exception& /* unnamed */) {.... }
. Es beantwortet Ihre Frage nicht, könnte aber Ihr Problem lösen.Antworten:
quelle
clang
scheint nicht dieses Pragma zu unterstützen, aber Sie können den gleichen Effekt mit erreichen#pragma clang diagnostic push
,#pragma clang diagnostic ignored "-Wunused-variable"
und#pragma clang diagnostic pop
. Siehe "Steuern der Diagnose über Pragmas" im Clang-Benutzerhandbuch/wd4101
. Beachten Sie, dass:
zwischen dem Flag und der Nummer kein Normalwert besteht und Sie keine durch Kommas getrennte Liste von Nummern erstellen können. Für andere Compiler könnte es/nowarn:4101
stattdessen sein.Wenn Sie eine Warnung nur in einer einzigen Codezeile unterdrücken möchten, können Sie den
suppress
Warnspezifizierer verwenden :Für eine einzelne Codezeile funktioniert dies genauso wie das Schreiben der folgenden:
quelle
suppress
arbeitet mit einer einzelnen, vorverarbeiteten Codezeile. Wenn die folgende Zeile#pragma warning(suppress: ...)
eine#include
Direktive ist (die die Datei, auf die durch ihren Parameter verwiesen wird, in die aktuelle Kompilierungseinheit erweitert), gilt der Effekt nur für die erste Zeile dieser Datei. Dies sollte offensichtlich sein, da vom Compiler Warnungen generiert werden. Der Compiler verarbeitet vorverarbeiteten Code.#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?quelle
:P
).Verwenden Sie
#pragma warning ( push )
dann#pragma warning ( disable )
, geben Sie Ihren Code ein und verwenden Sie ihn#pragma warning ( pop )
wie hier beschrieben :quelle
Beispiel:
Dieses Pragma gilt für C ++ ab 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: "Erwartete Deaktivierung oder Wiederherstellung".
(Ich denke, 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. Es würde so aussehen (aber nicht funktionieren):
Stattdessen
suppress
müssen Siedisable
undenable
:Das ist so hässlich, ich denke, es ist klüger, es einfach neu zu stylen:
quelle
Statt es auf der Datei des Setzens (oder sogar einer Header - Datei), wickeln Sie einfach den Code in Frage
#pragma warning (push)
,#pragma warning (disable)
und eine passende#pragma warning (pop)
, wie gezeigt hier .Obwohl es einige andere Optionen gibt, einschließlich
#pramga warning (once)
.quelle
Man kann auch
UNREFERENCED_PARAMETER
definiert in verwendenWinNT.H
. Die Definition ist nur:Und benutze es wie:
Warum sollten Sie es verwenden? Sie könnten argumentieren, dass Sie den Variablennamen selbst einfach weglassen können. Nun, es gibt Fälle (unterschiedliche Projektkonfiguration, Debug / Release-Builds), in denen die Variable möglicherweise tatsächlich verwendet wird. In einer anderen Konfiguration bleibt diese Variable unbenutzt (und daher die Warnung).
Einige statische Code-Analysen geben möglicherweise immer noch eine Warnung für diese unsinnige Anweisung aus (
wParam;
). In diesem Fall können Sie das verwenden,DBG_UNREFERENCED_PARAMETER
was mitUNREFERENCED_PARAMETER
Debug-Builds undP=P
Release- Builds identisch ist .quelle
[[maybe_unused]]
AttributWenn Sie das
unreferenced local variable
Schreiben in einem Header deaktivieren möchtenund verwenden
quelle
(void)unusedVar;
?(void)unusedVar;?
ist nicht C ++ Standard-konform.static_cast<void>(unusedVar)
.Any expression can be explicitly converted to type “cv void.” The expression value is discarded
wonach Sie schreiben könnenstatic_cast<void>(unusedVar)
undstatic_cast<const void>(unusedVar)
undstatic_cast<volatile void>(unusedVar)
. Alle Formulare sind gültig. Ich hoffe, es klärt Ihren Zweifel.In bestimmten Situationen müssen Sie einen benannten Parameter haben, den Sie jedoch nicht direkt verwenden.
Zum Beispiel bin ich auf VS2010 darauf gestoßen. Wenn 'e' nur in einer
decltype
Anweisung verwendet wird, beschwert sich der Compiler, aber Sie müssen die benannte Variable habene
.Alle oben genannten Nichtvorschläge beschränken sich
#pragma
darauf, nur eine einzige Aussage hinzuzufügen:quelle
Wie @rampion erwähnt hat, sind die Warnungen, wenn Sie sich in clang gcc befinden, nach Name und nicht nach Nummer, und Sie müssen Folgendes tun:
Diese Info kommt von hier
quelle