In einem C-Projekt 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;
}
Haben die beiden nichtig gewordenen Abgüsse irgendeinen Zweck?
(void)
etwas anderen Effekt verwendet. Diese Frage ist über CAntworten:
Dies dient dazu, Warnungen des Compilers zu vermeiden, da einige Parameter nicht verwendet werden.
quelle
Der Grund für nicht verwendete Parameter im Prototyp liegt normalerweise darin, dass die Funktion einer externen API entsprechen muss - möglicherweise handelt es sich um eine Bibliotheksfunktion, oder ein Zeiger auf diese Funktion wird an eine andere Funktion übergeben, die diese Aufrufkonvention erwartet. Es werden jedoch nicht alle Argumente, die von der aufrufenden Konvention verwendet werden, tatsächlich in der Funktion selbst benötigt.
Der Grund für die Erwähnung des Parameternamens im Body ist die Vermeidung von Warnungen wie
Diese Warnung kann durch Verwendung des Aktualparameters im Funktionskörper unterdrückt werden. Zum Beispiel, wenn Sie die folgende Anweisung haben:
Diese Warnung wird jetzt unterdrückt. Jetzt wird GCC jedoch eine weitere Warnung ausgeben:
Diese Warnung weist darauf hin, dass die Anweisung
ud;
, obwohl sie syntaktisch gültiges C ist, überhaupt nichts beeinflusst und möglicherweise ein Fehler ist, ähnlich wie die Anweisungdas hätte vielleicht so geschrieben werden sollen, als
abort();
ob es etwas tun würde.Und hier kommt die
(void)
Besetzung ins Spiel - sie wird dem Compiler eindeutig und explizit mitteilen, dass die Anweisung überhaupt keine Wirkung haben soll.quelle