Frage Deaktivieren Sie den einzelnen Warnfehler


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

Wenn ich zum Beispiel eine Ausnahme abfange und nicht damit handle, erhalte ich den Fehler 4101 (nicht referenzierte lokale Variable). Gibt es eine Möglichkeit, dies nur in dieser Funktion zu ignorieren, aber sonst in der Übersetzungseinheit zu melden? Im Moment lege ich an #pragma warning (disable : 4101) an der Spitze der Datei, aber das schaltet es offensichtlich nur für die ganze Einheit aus.


75
2017-08-23 10:06


Ursprung


Antworten:


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

126
2017-08-23 10:09



Wenn Sie eine Warnung nur in einer einzelnen Codezeile unterdrücken möchten, können Sie die suppress  Warnhinweis:

#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)

53
2017-08-22 13:06



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

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

23
2017-08-23 10:11



Benutzen #pragma warning ( push ), dann #pragma warning ( disable ), dann setze deinen Code, dann benutze #pragma warning ( pop ) wie beschrieben Hier:

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

9
2017-08-23 10:10



Anstatt es über die Datei (oder sogar eine Header-Datei) zu setzen, wickeln Sie einfach den betreffenden Code mit ein #pragma warning (push), #pragma warning (disable) und eine Übereinstimmung #pragma warning (pop), wie gezeigt Hier.

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


4
2017-08-23 10:08



Kann man auch benutzen UNREFERENCED_PARAMETER definiert in WinNT.H. Die Definition ist nur:

#define UNREFERENCED_PARAMETER(P)          (P)

Und benutze es wie:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

Warum würden Sie es verwenden, könnten Sie argumentieren, dass Sie einfach den Variablennamen selbst weglassen können. Nun, es gibt Fälle (unterschiedliche Projektkonfiguration, Debug / Release-Builds), wo die Variable tatsächlich verwendet werden könnte. In einer anderen Konfiguration steht diese Variable unbenutzt (und damit die Warnung).

Einige statische Code-Analyse kann immer noch Warnung für diese nicht-unsinnige Aussage (wParam;). In diesem Fall können Sie verwenden DBG_UNREFERENCED_PARAMETER das ist das gleiche wie UNREFERENCED_PARAMETER in Debug-Builds und tut es P=P im Release-Build.

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

4
2017-08-23 14:56



In bestimmten Situationen Muss Haben Sie einen benannten Parameter, aber Sie verwenden ihn nicht direkt.
Zum Beispiel lief ich bei VS2010 darauf, wenn 'e' nur in einem verwendet wird decltype Anweisung, beschwert sich der Compiler, aber Sie müssen die benannte Variable haben e.

Alle oben genannten#pragma Vorschläge führen alle dazu, nur eine einzige Aussage hinzuzufügen:

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

2
2017-08-07 08:58



Wenn Sie deaktivieren möchten unreferenced local variable schreibe in eine Kopfzeile

template<class T>
void ignore (const T & ) {}

und benutzen

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

1
2017-08-23 10:22



Beispiel:

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

Dieses Pragma ist gültig 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 # durch Visual Studio 2005 bis Visual Studio 2015.
Fehler: "Erwartete Deaktivierung oder Wiederherstellung".
(Ich nehme an, dass sie nie zur Implementierung kamen 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):

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

Anstatt von suppress, Sie 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 schlauer, es einfach neu zu gestalten:

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

1
2018-06-26 04:36