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
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 durch Verwendung des Aktualparameters im Funktionskörper unterdrückt werden. Zum Beispiel, wenn Sie die folgende Anweisung haben:
ud;
Diese Warnung wird jetzt unterdrückt. Jetzt wird GCC jedoch eine weitere Warnung ausgeben:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
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 Anweisung
abort;
das 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.