Ich möchte bestimmte Warnungen für alle Dateien deaktivieren, die direkt oder indirekt von bestimmten Include-Dateien enthalten sind. Zum Beispiel möchte ich die Warnung "Sie weisen einem Zeichen * ein Zeichenfolgenliteral zu" für alle Dateien oder Dateien deaktivieren, die in Dateien enthalten sind, die in a enthalten sind #include <bar/*>
(der Stern bedeutet in meinem Fall "alles kann hier sein").
Der Grund ist, dass einige der Leute, mit denen ich programmieren muss, "const" einfach nicht verwenden können, so dass ich am Ende viele Warnungen über diesen bestimmten Missbrauch von String-Literalen bekomme. Ich möchte diese Tausenden von Warnungen aus ihrem Code ignorieren, damit ich mich auf die Fehler in meinem eigenen Code konzentrieren und sie beheben kann.
Ich benutze Intel C ++ und GCC. Einige meiner Freunde verwenden Clang, daher würde ich mich auch über Lösungen freuen.
quelle
<bar/the_file.h>
, sollten die Warnungen unterdrückt werden und<the_file.h>
nicht?Antworten:
Wenn Sie GCC verwenden, können Sie das
-isystem
Flag anstelle des-I
Flags verwenden, um Warnungen von diesem Speicherort aus zu deaktivieren.Also, wenn Sie gerade verwenden
verwenden
stattdessen. Leider ist dies keine besonders feinkörnige Steuerung. Mir ist kein gezielterer Mechanismus bekannt.
quelle
Eine bessere GCC-Lösung: Verwenden Sie #pragma.
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-W<evil-option>" #include <evil_file> #pragma GCC diagnostic pop
zum Beispiel:
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include <QtXmlPatterns> #pragma GCC diagnostic pop
quelle
Wenn ich
g++
Header von Drittanbietern verwende, habe ich Tonnen von Warnungen mit meinen üblichen Standardeinstellungen von-Wall -Wextra
& co. Ich neige dazu, sie in separaten Includes zu gruppieren und die anzugeben .system_header
#pragma
Ich ziehe diese Lösung der vor
-isystem
, weil sie feinkörniger ist und ich sie direkt in die Quellen einfügen kann, ohne zu viel mit Befehlszeilenargumenten und Verzeichnissen zu tun zu haben.Beispiel mit der schrecklichen Stammbibliothek:
#ifndef ROOTHEADERS_HPP_INCLUDED #define ROOTHEADERS_HPP_INCLUDED #ifdef __GNUC__ // Avoid tons of warnings with root code #pragma GCC system_header #endif #include "TH1F.h" #include "TApplication.h" #include "TGraph.h" #include "TGraph2D.h" #include "TCanvas.h" #endif
quelle
Ich denke, die einfachste Lösung wäre, ein einfaches Skript zu schreiben, das den Compiler aufruft, die unerwünschte Ausgabe basierend auf dem Dateinamen und dem Warnungstyp kompiliert und entfernt. Sie können für jeden Compiler unterschiedliche Skripte verwenden.
Aktualisieren Sie einfach Ihr Makefile, um dieses Skript zu verwenden, anstatt den Compiler direkt aufzurufen.
quelle