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?
Es dient dazu, Warnungen des Compilers zu vermeiden, da einige Parameter nicht verwendet werden.
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.
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