Warum einen ungenutzten Funktionsparameterwert in void umwandeln?

Lesezeit: 3 Minuten

Benutzeravatar von Bastibe
Bastibe

In einigen C-Projekten habe ich diesen Code gesehen:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

Erfüllen die beiden Casts to void irgendeinen Zweck?

  • Stimmen Sie zum Schließen ab, da die richtige Antwort (Hemmen von Compiler-Warnungen über nicht verwendete Parameter) in Charles ‘verknüpfter Frage enthalten ist.

    – TED

    10. Januar 2011 um 14:22 Uhr

  • @Cody Gray – Aus diesem Grund wurde es geschlossen. Es war jedoch nicht wirklich ein Dup dieser Frage. 689677 sprach davon, Returns in void zu werfen, nicht Parameter.

    – TED

    10. Januar 2011 um 14:25 Uhr

  • Tatsächlich sind beide Duplikate für diese Frage nicht gültig. Das eine ist C++, das andere betrifft Rückgabewerte. Das sind nicht die gleichen Dinge. Gibt es Duplikate von C-Parametern?

    – Matt Tischler

    10. Januar 2011 um 14:25 Uhr


  • Dies ist eine andere Frage als die, die die vorgeschlagenen Duplikate abdeckten. Ich kann aber verstehen, warum der Fehler gemacht wurde. Wiedereröffnet (offensichtlich).

    – Tim Post

    15. November 2011 um 13:42 Uhr

  • Hinweis: Bitte schließen Sie dies nicht als Duplikat einer C++-Frage, wie es C++ verwendet (void) zu etwas anderem Effekt. Diese Frage bezieht sich auf C

    – Antti Haapala – Слава Україні

    24. August 2017 um 7:31 Uhr

Es dient dazu, Warnungen des Compilers zu vermeiden, da einige Parameter nicht verwendet werden.

  • Was ist der beste Weg, um die Warnungen zu unterdrücken: stackoverflow.com/questions/3417837/…

    – Ciro Santilli OurBigBook.com

    17. September 2014 um 7:12 Uhr


  • @Benoit was bewirkt eigentlich das Casting to void? Ist seine einzige Funktion, dem Compiler zu zeigen, dass Sie etwas absichtlich ignorieren, oder tut (void) tatsächlich etwas, und wenn der Compiler es sieht, zählt er es einfach so, als hätte er etwas mit der Variablen gemacht und gibt daher keine Warnung aus?

    – Tan Wang

    15. September 2016 um 14:20 Uhr

  • @TanWang Seine einzige Funktion besteht darin, dem Compiler zu zeigen, dass Sie etwas absichtlich ignorieren. Es wird nichts zur Laufzeit tun.

    – zol

    27. September 2016 um 20:23 Uhr

  • Weiß jemand wo das dokumentiert ist? Sprachspezifikation? Compiler-Handbuch? Hat es einen Namen (solche Aussage)?

    – Kamil

    13. Februar um 23:26 Uhr


Der Grund für unbenutzt haben Parameter im Prototyp liegt normalerweise daran, dass die Funktion einer externen API entsprechen muss – vielleicht handelt es sich um eine Bibliotheksfunktion, oder ein Zeiger auf diese Funktion wird an eine andere Funktion übergeben, die diese Aufrufkonvention erwartet. Allerdings werden nicht alle Argumente, die von der Aufrufkonvention verwendet werden, tatsächlich in der Funktion selbst benötigt.

Der Grund für erwähnen Der Parametername im Body soll Warnungen wie vermeiden

unused.c: In function ‘l_alloc’:
unused.c:3:22: warning: unused parameter ‘ud’ [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

Diese Warnung kann mit Hilfe des Aktualparameters im Funktionsrumpf unterdrückt werden. Zum Beispiel, wenn Sie die folgende Aussage haben:

ud;

Diese Warnung wird nun unterdrückt. Aber jetzt wird GCC produzieren Ein weiterer Warnung:

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

Dies Warnung sagt, dass die Aussage ud;obwohl es syntaktisch gültiges C ist, beeinflusst überhaupt nichts und ist möglicherweise ein Fehler, nicht anders als die Anweisung

abort;

was vielleicht hätte geschrieben werden sollen abort(); stattdessen, damit es etwas tut.

Und das ist, wo die (void) cast kommt – er teilt dem Compiler eindeutig und explizit mit, dass die Anweisung absolut keine Wirkung haben soll.

1421440cookie-checkWarum einen ungenutzten Funktionsparameterwert in void umwandeln?

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

Privacy policy