Wie deaktiviere ich die nicht verwendeten Variablenwarnungen, die aus gcc im Code eines Drittanbieters kommen, den ich nicht bearbeiten möchte?

93

Ich möchte wissen, welchen Schalter Sie an den gcc-Compiler übergeben, um nicht verwendete Variablenwarnungen zu deaktivieren. Ich bekomme Fehler durch Boost unter Windows und möchte den Boost-Code nicht berühren:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

Ich habe versucht , sowohl mit -Wunused-valueund -Wno-unused-valueaber weder unterdrückt die Meldungen über.

Was ist der richtige Befehl, hier ist meine Kompilierungszeile:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Vielleicht -Wallüberschreibt das mein Ziel?

WilliamKF
quelle
Wie die Fehlermeldung mehr oder weniger sagt, versuchen Sie-Werror=no-unused-variable
Joachim Isaksson

Antworten:

236

Der -Wno-unused-variableSchalter macht normalerweise den Trick. Dies ist jedoch in der Tat eine sehr nützliche Warnung, wenn Sie sich in Ihrem Projekt um diese Dinge kümmern. Es wird ärgerlich, wenn GCC Sie vor Dingen warnt, die nicht in Ihrem Code enthalten sind.

Ich würde empfehlen, die Warnung beizubehalten, aber -isystemanstelle von -IVerzeichnissen von Projekten von Drittanbietern zu verwenden. Dieses Flag weist GCC an, Sie nicht vor Dingen zu warnen, über die Sie keine Kontrolle haben.

Zum Beispiel statt -IC:\\boost_1_52_0sagen -isystem C:\\boost_1_52_0.

Ich hoffe es hilft. Viel Glück!


quelle
Wo kann ich diese Einstellung hinzufügen? Wurde unter "Projekteinstellungen / AVR GNU C Compiler / Verschiedenes" ausgeführt, aber es wird ignoriert (Pfad ist korrekt, weiterhin Warnungen erhalten). Wenn Sie dies zu den Verzeichniseinstellungen hinzufügen (deaktivieren Sie das Kontrollkästchen für den relativen Pfad), stürzt AtmelStudio ab.
hfrmobile
3
Wir haben auch -Wno-unused-parameterfür nicht verwendete Funktionsparameter, -Wno-unused-functionfür nicht verwendete Funktion
Ngo Thanh Nhan
1
Sie benötigen:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer
81

Manchmal müssen Sie nur einige Warnungen unterdrücken und möchten andere Warnungen beibehalten, um sicher zu gehen. In Ihrem Code können Sie die Warnungen für Variablen und sogar formale Parameter mithilfe des nicht verwendeten Attributs von GCC unterdrücken . Nehmen wir an, Sie haben dieses Code-Snippet:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Es kann vorkommen, dass Sie diese Funktion als Handler verwenden müssen - was (imho) in der C ++ Boost-Bibliothek durchaus üblich ist. Dann müssen Sie die zweite formale Parameter Version , so dass die Signatur der Funktion das gleiche wie die Vorlage ist der Handler benötigt, sonst wäre die Kompilierung fehlschlagen. Aber Sie brauchen es auch nicht wirklich in der Funktion selbst ...

Die Lösung zum Markieren von Variablen oder formalen Parametern, die von Warnungen ausgeschlossen werden sollen, lautet wie folgt:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC hat viele andere Parameter, die Sie in den Manpages überprüfen können . Dies funktioniert auch für die C-Programme, nicht nur für C ++, und ich denke, es kann in fast jeder Funktion verwendet werden, nicht nur in Handlern. Probieren Sie es aus! ;)

PS: In letzter Zeit habe ich dies verwendet, um Warnungen vor der Serialisierung von Boosts in einer Vorlage wie der folgenden zu unterdrücken:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

EDIT: Anscheinend habe ich deine Frage nicht so beantwortet, wie du es brauchst . Drak0sha hat es besser gemacht. Es ist, weil ich hauptsächlich dem Titel der Frage gefolgt bin, mein schlechtes. Hoffentlich könnte dies anderen Leuten helfen, die wegen dieses Titels hierher kommen ... :)

Dee'Kej
quelle
7
Bei formalen Parametern können Sie den Namen weglassen, z void func(unsigned number, const int). Dann wird sich gcc auch nicht über unbenutzte beschweren version.
Olaf Dietsche
@OlafDietsche Ich denke, das hängt von der gccVersion ab, die Sie verwenden. IIRC, ich musste es vor 4 Jahren verwenden, um Warnungen vor unbenutzten zu unterdrücken version. ;)
Dee'Kej
66

Wenn Sie gcc verwenden und die Warnung für den ausgewählten Code deaktivieren möchten, können Sie die Compiler-Direktive #pragma verwenden:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Für Code, den Sie steuern, können Sie __attribute__((unused))den Compiler auch anweisen, dass bestimmte Variablen nicht verwendet werden.

Ole Wolf
quelle
Im Allgemeinen würde ich sagen, dass die Verwendung von # Pragma-Direktiven nicht sehr sicher ist, es sei denn, Sie wissen wirklich, was Sie tun, oder Sie verwenden z. B. OpenMP für die Parallelisierung ...;)
Dee'Kej
1
@ Dee'Kej- #pragmaDirektiven sind absolut sicher, wenn Sie sie einpacken #ifdef some_compiler ... #endif. Warnungen sind eine compilerspezifische Funktion und werden vom Standard nicht definiert. Sie können keine Warnungen aus Code ohne #pragmas unterdrücken .
Kotauskas
@ vladislav-toncharov Sie haben Recht damit, dass Warnungen compilerspezifisch sind. Wir sprechen hier jedoch nicht allgemein von Compiler-Warnungen, sondern speziell von GCC. Sie haben auch Recht damit, dass #pragma nicht schädlich ist. Allerdings wissen IMO viele Leute nicht, wie man #pragma richtig benutzt, und deshalb halte ich es für "gefährlich" (mangels besserer Wörter).
Dee'Kej
15

Siehe man gccunter Warnoptionen. Dort haben Sie eine ganze Reihe vonunused

Warnung Optionen
... -Wunused -Wunused-Funktion -Wunused-label -Wunused-Parameter -Wunused-Wert -Wunused-Variable -Wunused-but-Set-Parameter -Wunused-but-set-variable

Wenn Sie einem von ihnen ein Präfix voranstellen no-, wird diese Warnung deaktiviert.

Viele Optionen haben lange Namen, die mit -f oder -W --- beginnen, z. B. -fmove-loop-invariants, -Wformat und so weiter. Die meisten davon haben sowohl positive als auch negative Formen; Die negative Form von -ffoo wäre -fno-foo. Dieses Handbuch dokumentiert nur eines dieser beiden Formulare, je nachdem, welches nicht das Standardformular ist.

Eine ausführlichere Erläuterung finden Sie unter Optionen zum Anfordern oder Unterdrücken von Warnungen

Olaf Dietsche
quelle
Wusste nicht, dass ich "no-" mit Warnungen voranstellen kann.
RNA
10

Verwendung -Wno-unused-variablesollte funktionieren.

Mats Petersson
quelle
Ahh, unbenutzte Variable, nicht unbenutzter Wert!
WilliamKF
5
Oder -Wno-error=unused-variablewenn Sie den Fehler beheben und die Warnung beibehalten möchten.
Oskar N.
1
Sie können tatsächlich sehen, was die tatsächliche Warnung ist [-Werror=unused-variable].
Mats Petersson
3

Der Compiler sagt es dir schon, es ist valueaber nicht so variable. Sie suchen -Wno-unused-variable. Versuchen Sie auch g++ --help=warnings, eine Liste der verfügbaren Optionen anzuzeigen.

Daniel Frey
quelle
3

Wie deaktivieren Sie die nicht verwendeten Variablenwarnungen, die von gcc ausgehen?
Ich bekomme Fehler durch Boost unter Windows und möchte den Boost-Code nicht berühren ...

Sie besuchen Boost's Trac und reichen einen Fehlerbericht gegen Boost ein.

Ihre Anwendung ist nicht für das Löschen von Warnungen und Fehlern in der Bibliothek verantwortlich. Die Bibliothek ist dafür verantwortlich, ihre eigenen Warnungen und Fehler zu löschen.

jww
quelle
0

-Wallund -Wextralegt die Bühne in GCC fest und die nachfolgende -Wno-unused-variablekann nicht wirksam werden. Zum Beispiel, wenn Sie haben:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

dann sieht GCC die Anweisung -Wall -Wextraund scheint sie zu ignorieren-Wno-unused-variable

Dies kann stattdessen wie folgt aussehen und Sie erhalten den gewünschten Effekt, dass Sie in Ihrer Kompilierung für die nicht verwendete Variable nicht gestoppt werden:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Es gibt einen guten Grund, warum es als "Warnung" oder "Fehler" bezeichnet wird. Das Fehlschlagen der Kompilierung, nur weil Ihr Code nicht vollständig ist (sagen wir, Sie stubben den Algorithmus aus), kann eine Niederlage bedeuten.

William Cerniuk
quelle
-3
export IGNORE_WARNINGS=1

Es werden zwar Warnungen angezeigt, der Build wird jedoch fortgesetzt

Sifiso Myeni
quelle