Was ist der beste/ordentlichste Weg, um einen Compiler (in diesem Fall GCC) wie die Warnung “Unused variable x” zu unterdrücken?
Ich möchte GCC keine bestimmten Flags geben, um all diese Warnungen zu entfernen, nur für spezielle Fälle.
Gustav
Was ist der beste/ordentlichste Weg, um einen Compiler (in diesem Fall GCC) wie die Warnung “Unused variable x” zu unterdrücken?
Ich möchte GCC keine bestimmten Flags geben, um all diese Warnungen zu entfernen, nur für spezielle Fälle.
jamesdlin
(void) variable
könnte für einige Compiler funktionieren.
Für C++-Code siehe auch Mailbag: Compiler-Warnungen schließen wobei Herb Sutter die Verwendung empfiehlt:
template<class T> void ignore( const T& ) { }
...
ignore(variable);
Dies funktioniert auf gcc 4.7.1 mit -std=c99
– Wayne Konrad
2. Mai 2013 um 16:59 Uhr
Und es funktioniert auch auf VS.
– AndersK
17. Dezember 2013 um 20:54 Uhr
(void) funktioniert nicht mit nvcc 7.5 mit gcc 4.9.2 und aktiviertem C++11. Der Kräuterbutter-Link mit template<class T> void ignore( const T& ) { }
funktioniert super!
– Ax3l
21. Januar 2016 um 16:21 Uhr
Die ursprüngliche Frage ist als C gekennzeichnet, nicht als C++. Soweit ich weiß, funktioniert die (void)var in allen gängigen C-Compilern.
– Kalmarius
18. März 2016 um 13:46 Uhr
(void) variable
ist cool, weil es für alle nicht verwendeten Variablen funktioniert, nicht nur für Funktionsparameter wie bei der akzeptierten Antwort.
– Groo
11. Juli 2017 um 10:37 Uhr
void foo(int /*bar*/) {
...
}
Siehe Einzelantworten für __attribute__((unused))
verschiedene #pragma
s und so weiter. Optional können Sie für die Portabilität ein Präprozessor-Makro darum wickeln.
IDEs können ungenutzte Variablen visuell signalisieren (andere Farbe oder Unterstreichung). Damit ist die Compiler-Warnung möglicherweise ziemlich nutzlos.
Fügen Sie in GCC und Clang hinzu -Wno-unused-parameter
Option am Ende der Befehlszeile (nach allen Optionen, die die Warnung vor unbenutzten Parametern einschalten, wie z -Wall
, -Wextra
).
void foo(int bar) {
(void)bar;
}
Gemäß Jamesdlins Antwort und Mailbag: Compiler-Warnungen schließen.
Ich kann nicht glauben, dass das Auskommentieren funktioniert. Das ist der richtige Weg, wenn Sie C++ verwenden und es kompatibel ist.
– Ross Rogers
19. Mai 2016 um 16:23 Uhr
Eduard Leno
Ich habe einen Artikel gefunden, http://sourcefrog.net/weblog/software/languages/C/unused.htmldas erklärt UNGEBRAUCHT. Es ist interessant, dass der Autor auch den unbenutzten Variablennamen verstümmelt, damit Sie ihn in Zukunft nicht versehentlich verwenden können.
Auszug:
#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif
void dcc_mon_siginfo_handler(int UNUSED(whatsig))
… ein weiteres Nur-Schreiben-Header-Makro ist genau das, was wir brauchen, um eine eher harmlose Warnung aus dem Weg zu räumen.
– jpinto3912
5. August 2010 um 21:24 Uhr
Ich bin bei dir. Mein Code enthält static const char cvsid[] = "$Id$";
. Das ist kurz und bündig und lesbar, aber gcc -Wall wirft ein Wackeln darauf. Ich möchte nicht all diesen undurchdringlichen Code schreiben müssen, nur um diesen Fehler zu unterdrücken.
– Eduard Falk
26. Mai 2016 um 19:27 Uhr
Der Link ist kaputt: “Fehler: Nicht gefunden. Die angeforderte URL /weblog/software/languages/C/unused.html wurde auf diesem Server nicht gefunden.”
– Peter Mortensen
14. November 2021 um 23:04 Uhr
Betreff “UNGEBRAUCHT”: Meinst du nicht ungebraucht (das GCC-Ding)?
– Peter Mortensen
14. November 2021 um 23:06 Uhr
Können Sie auf jeden Fall auf die Dokumentation verlinken? (Aber ohne “Edit:”, “Update:”, oder ähnliches – die Antwort sollte so aussehen, als wäre sie heute geschrieben worden.)
– Peter Mortensen
14. November 2021 um 23:26 Uhr
Cascabel
Wenn Sie das wirklich wollen, können Sie die verwenden ungebraucht Attribut (nur GCC), so etwas wie:
void foo(int __attribute__((__unused__)) bar) {
...
}
Natürlich nicht nur für Funktionsparameter, aber das ist der häufigste Anwendungsfall, da es sich möglicherweise um eine Callback-Funktion für eine API handelt, bei der Sie nicht alle Eingaben benötigen.
Zusätzlich, GLib hat ein G_GNUC_UNUSED-Makro, das meines Erachtens auf dieses Attribut erweitert wird.
James Webster
Sie können die Warnung mit stumm schalten #pragma
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused"
int unususedVariable = 1;
#pragma clang diagnostic pop
Wenn Sie GCC verwenden, verwenden Sie #pragma gcc ...
Vielleicht sollte die letzte Zeile sein #pragma clang diagnostic pop
– Jason Lee
15. September 2014 um 3:49 Uhr
#pragma GCC ...
(es will GCC in Großbuchstaben)
– Evgen
10. Februar 2017 um 20:49 Uhr
nmichaels
#pragma unused <variable>
Vielleicht sollte die letzte Zeile sein #pragma clang diagnostic pop
– Jason Lee
15. September 2014 um 3:49 Uhr
#pragma GCC ...
(es will GCC in Großbuchstaben)
– Evgen
10. Februar 2017 um 20:49 Uhr
Mike Stroven
Die Umwandlung in ein void ist der beste Ansatz, da es zeigt, dass Sie die Variable nicht “versehentlich” in Ihrem Code beibehalten haben – dh: diese Funktion könnte eine Instanz sein, in der Sie eine Tabelle mit Funktionszeigern haben, die dieselben Parametertypen benötigen und Rückgabetypen, aber in diesem speziellen Tabelleneintrag verwenden Sie den Parameter nicht.
Das heißt, wenn Sie es nicht brauchen, werden Sie es los. 😉
Können Sie ein Beispiel hinzufügen (das tatsächlich kompiliert (mit einer bestimmten Version eines oder mehrerer bestimmter Compiler))? (Aber ohne “Edit:”, “Update:”, oder ähnliches – die Antwort sollte so aussehen, als wäre sie heute geschrieben worden.)
– Peter Mortensen
14. November 2021 um 23:15 Uhr
Es gibt legitime Gründe dafür, zB nehmen Sie die Plugin-Entwicklung für ein System, das Ihre Funktion mit einer bestimmten Signatur erwartet, wie
void function_name(int par1, char *par2);
und Sie müssen nur an Par2 arbeiten.– Rückstand
7. Februar 2012 um 17:04 Uhr
Schreiben Sie in diesem Fall die Signatur als
void function_name(int par1, char*);
was vollkommen gültig ist und keine Warnungen generiert.– Frank Küster
18. Februar 2013 um 13:52 Uhr
@spaceknarf Wenn ich das mit gcc 4.7.2 mache, bekomme ich
error: parameter name omitted
.– craig65535
23. Februar 2013 um 1:18 Uhr
Ich glaube nicht, dass es gültig ist, einen Parameter in einer C-Funktionssignatur unbenannt zu lassen, wenn er Teil der Definition ist. Es ist jedoch in C++ akzeptabel.
– davidA
28. September 2016 um 20:11 Uhr
Dies ist kein Duplikat, dies ist eine andere Frage. Die anderen Fragen fragen, welche Möglichkeiten es gibt, die Warnung zu unterdrücken, diese Frage fragt, welche Möglichkeit wir verwenden sollten.
– 12431234123412341234123
31. August 2020 um 16:12 Uhr