La raison d' avoir des paramètres inutilisés dans le prototype est généralement parce que la fonction doit se conformer à une API externe - peut-être est-ce une fonction de bibliothèque, ou un pointeur vers cette fonction est passé à une autre fonction qui attend cette convention d'appel. Cependant, tous les arguments utilisés par la convention d'appel ne sont pas réellement nécessaires dans la fonction elle-même.
La raison de mentionner le nom du paramètre dans le corps est d'éviter les avertissements tels que
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) {
^~
Cet avertissement peut être supprimé en utilisant le paramètre réel dans le corps de la fonction. Par exemple, si vous avez l'instruction suivante:
ud;
Cet avertissement est maintenant supprimé. Cependant maintenant GCC produira un autre avertissement:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
Cet avertissement indique que l'instruction ud;
, tout en étant syntaxiquement valide C, n'affecte rien du tout, et est peut-être une erreur, un peu comme l'instruction
abort;
ce qui aurait peut-être dû être écrit abort();
pour faire quelque chose.
Et c'est là que la (void)
distribution entre en jeu - elle dira au compilateur sans ambiguïté et explicitement que l'instruction est censée n'avoir absolument aucun effet.