Wie kann ich Warnungen “nicht verwendeter Parameter” in C unterdrücken?

Lesezeit: 5 Minuten

Benutzeravatar von nixgadget
Nixgadget

Zum Beispiel:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

In C++ konnte ich a setzen /*...*/ kommentieren Sie die Parameter. Aber natürlich nicht in C, wo es mir den Fehler gibt:

Fehler: Parametername weggelassen

  • Mögliches Duplikat von Was ist der beste Weg, um die Warnung “Unbenutzte Variable x” zu unterdrücken

    – Ciro Santilli OurBigBook.com

    17. September 2014 um 7:14 Uhr

  • @CiroSantilli Diese Frage hat mehr positive Stimmen, es wäre besser, die andere Frage als doppelt zu markieren.

    – Saschoalm

    20. Januar 2015 um 13:18 Uhr

  • Siehe auch die C++-Version dieser Frage

    – Shafik Yaghmour

    28. Juli 2015 um 19:58 Uhr

  • -Wno-unused-parameter, es ist einfach zu laut und fängt selten Fehler, besonders. Wenn -Wshadow wird genutzt.

    – Trass3r

    15. August 2019 um 15:55 Uhr

Benutzeravatar von mtvec
mtvec

Normalerweise schreibe ich ein Makro so:

#define UNUSED(x) (void)(x)

Sie können dieses Makro für alle Ihre nicht verwendeten Parameter verwenden. (Beachten Sie, dass dies auf jedem Compiler funktioniert.)

Zum Beispiel:

void f(int x) {
    UNUSED(x);
    ...
}

  • Ich verwende einfach (void)x direkt

    – Prof. Falken

    30. Mai 2012 um 11:27 Uhr

  • Während dies AFAIK der einzige portable Weg ist, kann es ärgerlich sein, wenn Sie die Variable später verwenden und vergessen, die nicht verwendete Zeile zu entfernen. deshalb GCCs ungebraucht ist schön.

    – Ideengeber42

    7. November 2012 um 13:58 Uhr

  • @CookSchelling: Ah, aber so solltest du es nicht verwenden. Mach so etwas: void f(int x) {UNUSED(x);}.

    – mtvec

    17. Januar 2013 um 7:00 Uhr

  • @Alcott, weil (wie in meinem Fall) die Funktion eine von vielen sein könnte, die dieselbe Signatur haben müssen, weil sie von einem Funktionszeiger referenziert werden.

    – josch

    19. September 2014 um 5:50 Uhr

  • Ich benutze #define UNUSED(...) (void)(__VA_ARGS__) wodurch ich dies auf mehrere Variablen anwenden kann.

    – Matthew Mitchell

    13. November 2014 um 18:31 Uhr

In GCC können Sie den Parameter mit beschriften unused Attribut.

Dieses an eine Variable angehängte Attribut bedeutet, dass die Variable sein soll möglicherweise ungebraucht. GCC gibt für diese Variable keine Warnung aus.

In der Praxis wird dies durch Putten erreicht __attribute__ ((unused)) kurz vor dem Parameter. Zum Beispiel:

void foo(workerid_t workerId) { }

wird

void foo(__attribute__((unused)) workerid_t workerId) { }

  • Für jeden Neuling wie mich bedeutet das Putten __attribute__ ((unused)) vor dem Argument.

    – josch

    19. September 2014 um 5:53 Uhr

  • @josch Ich denke, Sie haben völlig Recht, aber die Dokumentation scheint zu implizieren, dass es gestellt werden sollte nach der Parameter. Beide Optionen werden wahrscheinlich problemlos unterstützt.

    – Antonio

    24. April 2015 um 9:43 Uhr


  • Beachte das auch __attribute__((unused)) ist eine proprietäre GCC-Erweiterung. Es wird von einigen anderen Compilern unterstützt, aber ich gehe davon aus, dass dies mit MSVC nicht funktioniert. Es ist jedoch nicht direkt Teil des Compiler-Standards, daher ist dies nicht so portabel wie einige andere Optionen

    – Zoe steht mit der Ukraine

    23. August 2019 um 20:51 Uhr

  • Eine Erweiterung innerhalb von GCC als “proprietär” zu bezeichnen, ist, äh, na ja, es ist etwas.

    – cx-berger

    27. Mai 2021 um 18:54 Uhr

  • Als kleine Verallgemeinerung __attribute__ ((unused)) int myUnusedFunc() gibt keine Warnungen zu unbenutzten Funktionen aus

    – Alex Li

    3. Mai um 22:16 Uhr


Benutzeravatar von ideasman42
Ideengeber42

Sie können GCC oder verwenden Klirren‘s ungebraucht Attribut. Ich verwende diese Makros jedoch in einem Header, um zu vermeiden, dass GCC-spezifische Attribute in der gesamten Quelle vorhanden sind, auch mit __attribute__ überall ist ein bisschen wortreich/hässlich.

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif

#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

Dann kannst du…

void foo(int UNUSED(bar)) { ... }

Ich bevorzuge dies, weil Sie eine Fehlermeldung erhalten, wenn Sie versuchen, es zu verwenden bar irgendwo im Code, damit Sie das Attribut nicht versehentlich drin lassen können.

Und für Funktionen …

static void UNUSED_FUNCTION(foo)(int bar) { ... }

Anmerkung 1):

Soweit ich weiss, MSVC hat kein Äquivalent zu __attribute__((__unused__)).

Anmerkung 2):

Das UNUSED Makro funktioniert nicht für Argumente, die Klammern enthalten,
Also, wenn Sie ein Argument haben, wie float (*coords)[3] Sie kippen tun,
float UNUSED((*coords)[3]) oder float (*UNUSED(coords))[3]. Dies ist der einzige Nachteil des UNUSED Makros habe ich bisher gefunden, und in diesen Fällen greife ich auf zurück (void)coords;.

  • Oder vielleicht nur #define __attribute__(x) für Nicht-GCC-Umgebungen (AFAIK keine der __attribute__ werden von MSVC unterstützt)?

    – Franklin Yu

    10. November 2017 um 6:16 Uhr

  • Das kann funktionieren, aber Dunder-Begriffe mit Präfix sind für den Compiler reserviert, also würde ich das lieber vermeiden.

    – Ideengeber42

    10. November 2017 um 11:22 Uhr


  • Für meinen gcc scheint zumindest das Platzieren des Attributbezeichners vor dem Bezeichner richtig für Funktionen, Variablen und Parameter zu funktionieren, also etwas wie #define POSSIBLY_UNUSED(Bezeichner) Attribut__((__unbenutzt)) Bezeichner können für alle drei verwendet werden

    – Britton Krein

    2. März 2018 um 22:01 Uhr


  • Wenn ich es setze, nachdem ich es bekommen habe warning: unused parameter ‘foo’ [-Wunused-parameter] (ggc 7.3.0)

    – Ideengeber42

    3. März 2018 um 8:39 Uhr


  • UNREFERENCED_PARAMETER(p) ist in WinNT.h definiert

    – david

    20. Juni 2021 um 22:27 Uhr

Da dies als gcc gekennzeichnet ist, können Sie den Befehlszeilenschalter verwenden Wno-unused-parameter.

Zum Beispiel:

gcc -Wno-unused-parameter test.c

Dies wirkt sich natürlich auf die gesamte Datei aus (und möglicherweise auf das Projekt, je nachdem, wo Sie den Schalter eingestellt haben), aber Sie müssen keinen Code ändern.

Teddys Benutzeravatar
Teddy

Mit GCC mit der ungebraucht Attribut:

int foo (__attribute__((unused)) int bar) {
    return 0;
}

Benutzeravatar von Calm
Ruhig

Eine gcc/g++-spezifische Möglichkeit, die Warnung vor unbenutzten Parametern für einen Quellcodeblock zu unterdrücken, besteht darin, ihn in die folgenden Pragma-Anweisungen einzuschließen:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop

keiths Benutzeravatar
Keith

Seit C++ 17 ist die [[maybe_unused]] -Attribut kann verwendet werden, um Warnungen über unbenutzte Parameter zu unterdrücken.

Basierend auf dem Beispielcode des OP:

Bool NullFunc([[maybe_unused]] const struct timespec *when, [[maybe_unused]] const char *who)
{
   return TRUE;
}

  • Beachten Sie, dass die Frage C und nicht C++ angibt. Diese Antwort funktioniert gut in C++. Für alle, die versucht sind, dies mit dem einfachen alten C zu versuchen, wird es ohne Vorwarnung kompiliert (zumindest mit GCC), sodass es „funktioniert“, aber Tools wie clang-tidy werden es hassen.

    – chrBrd

    14. Dezember 2021 um 3:25 Uhr

1426310cookie-checkWie kann ich Warnungen “nicht verwendeter Parameter” in C unterdrücken?

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

Privacy policy