Beste Möglichkeit, die C-Warnung “Unused variable x” zu unterdrücken? [duplicate]

Lesezeit: 6 Minuten

gustafs Benutzeravatar
Gustav

Was ist der beste / sauberste Weg, um einen C-Compiler (z. B. GCC) wie die Warnung “Unused variable x” zu unterdrücken?

Die Dokumentation von GCC erklärt

-Wunused-Variable
Warnt, wenn eine lokale Variable oder eine nicht konstante statische Variable abgesehen von ihrer Deklaration nicht verwendet wird

Ich möchte meinem Compiler keine bestimmten Flags geben, um all diese Warnungen zu entfernen, nur für spezielle Fälle.

  • 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

Benutzeravatar von jamesdlin
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.

    – vgru

    11. Juli 2017 um 10:37 Uhr

Informieren Sie Ihren Compiler über einen Compiler-spezifischen Nicht-Standard-Mechanismus

Siehe Einzelantworten für __attribute__((unused))verschieden #pragmas und so weiter. Optional können Sie für die Portabilität ein Präprozessor-Makro darum wickeln.

Schalten Sie die Warnung aus

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

Füge eine Besetzung zu Void hinzu

void foo(int bar) {
    (void)bar;
}

Gemäß Jamesdlins Antwort und Mailbag: Compiler-Warnungen schließen.

Geben Sie der Variablen keinen Namen (nur C23 und C++)

In C vor dem C23-Standard nicht erlaubt, aber mit einem neuesten Compiler (in 2023) und in C++ (seit wie für immer) kann man es tun

void foo(int /*bar*/) {
    ...
}

Siehe die N2480 Zulassen unbenannter Parameter in einer Funktionsdefinition (pdf) Vorschlag und überprüfen Sie den Umsetzungsstatus unter https://en.cppreference.com/w/c/compiler_support

GCC 11, Clang 11 und ICX 2022.2 (oneAPI 2022.3) unterstützen dies.

  • 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

Benutzeravatar von Edward Leno
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

Benutzeravatar von Cascabel
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.

Benutzeravatar von James Webster
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

Benutzeravatar von nmichaels
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

Benutzeravatar von Mike Stroven
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


1447530cookie-checkBeste Möglichkeit, die C-Warnung “Unused variable x” zu unterdrücken? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy