Verwenden Sie #pragma warning push / pop den richtigen Weg, um die Warnstufe vorübergehend zu ändern?

Hin und wieder ist es schwierig, C ++ – Code zu schreiben, der überhaupt keine Warnungen ausgibt. Das Aktivieren von Warnungen ist jedoch eine gute Idee. Daher ist es oft notwendig, Warnungen um ein bestimmtes Konstrukt zu deaktivieren und sie in allen anderen Codeteilen aktivieren zu lassen.

Ich habe bisher zwei Möglichkeiten gesehen, dies zu tun.

Die erste ist die Verwendung von #pragma warning( push ) und #pragma warning( pop ) :

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

Die zweite #pragma warning( default ) ist die Verwendung von #pragma warning( default ) :

  #pragma warning( disable: ThatWarning ) //code with ThatWarning here #pragma warning( default: ThatWarning ) 

Das Problem, das ich in der zweiten Variante sehe, ist, dass es die ursprüngliche Warnstufe verwirft – die Warnung war möglicherweise vorher ausgeschaltet oder die Warnstufe wurde möglicherweise geändert. Mit der default würden diese Änderungen verworfen.

Der erste Ansatz sieht sauber aus. Gibt es irgendwelche Probleme damit? Gibt es bessere Möglichkeiten, dasselbe zu erreichen?

Die erste Methode ist der beste Weg, IMO. Ich kenne keine Probleme damit.

Bedenken Sie, dass ein #pragma compilerspezifisch ist, also erwarten Sie nicht, dass es auf jedem Compiler da draußen funktioniert 🙂

Dies funktioniert mit mehreren Compilern (und verschiedenen Versionen von Compilern).

Kopfzeile “push”

 #if defined(__clang__) # pragma clang diagnostic push #endif #if defined(_MSC_VER) # pragma warning(push) #endif #if defined(YOUR_FAVORITE_COMPILER) # pragma your compiler push warning #endif 

Kopfzeile “pop”

 #if defined(__clang__) # pragma clang diagnostic pop #endif #if defined(_MSC_VER) # pragma warning(pop) #endif 

Einige Warnung

 #if defined(__clang__) # pragma clang diagnostic ignored "-Wunused-parameter" # pragma clang diagnostic ignored "-Wunused-variable" # if __has_warning("-Wnew-special-warning") # pragma clang diagnostic ignored "-Wnew-special-warning" # endif #endif #if defined(_MSC_VER) # pragma warning(disable: 4100) // unreferenced formal parameter # if _MSC_VER > _MSC_SOME_VERSION # pragma warning(disable: xxxx) // disable one more for special version # endif #endif 

Verwendung

 // This code reports warnings // ... #include  #include  #include  #include  // This code ignores warnings type_{1,2,3} // ... #include  // Back to reporting warnings // ... 

Zusätzlich können Wächter überprüfen, dass es keine Doppel-Push / Pop / Deaktivierungs-Warnungspragmas gibt.

Aktualisieren

  • Implementierung
  • Liste der verfügbaren Warnungen
  • CMake Companion-function zum Generieren von Flags

Es ist zu spät für einen spitzen Zahn, aber für alle Googler da draußen:

 #pragma warning ( suppress: ThatWarning ) // one single line with ThatWarning 

ist kurz (in der Regel seit VS 2008 , aber in VS 2005 nur für Code Analyzer-Warnungen):

 #pragma warning ( push ) #pragma warning ( disable: ThatWarning ) // one single line with ThatWarning #pragma warning ( pop ) 

Der richtige Ansatz (obwohl ein bisschen hässlich)

 #ifdef _MSC_VER #pragma warning( push ) #pragma warning( once: ThatWarning ) #endif //code with ThatWarning here #ifdef _MSC_VER #pragma warning( pop ) #endif 

Sie können bestimmte Warnungen in den Projekt- oder Dateioptionen deaktivieren und diese Einstellung gilt als “Standard” für diese #pragmas im entsprechenden Bereich. Einige der Warnungen in VS2005 sind so nutzlos / nervig, dass dies die Ausgabe ziemlich aufräumt, wenn /W4 .

Dies ist in den Eigenschaften unter Konfigurationseigenschaften -> C / C ++ -> Erweitert.

Ich habe keine Probleme mit der ersten Variante. Vielleicht ist der bessere Weg, das folgende zu verwenden:

  #pragma warning( push ) #pragma warning( once: ThatWarning ) //code with ThatWarning here #pragma warning( pop ) 

Dadurch werden Sie wissen, dass im Code immer noch Warnungen vorhanden sind, aber die Warnmeldungen sind nicht so störend. Aber das ist Geschmackssache.