Dans certains projets C, j'ai vu ce code:
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;
}
Les deux lancers à annuler servent-ils à quelque chose?
Il est là pour éviter les avertissements du compilateur car certains paramètres ne sont pas utilisés.
La raison des paramètres n'ayant pas utilisé dans le prototype est généralement due au fait que la fonction doit se conformer à une API externe - il s'agit peut-être d'une fonction de bibliothèque, ou un pointeur vers cette fonction est transmis à une autre fonction qui attend cela. 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 mentionnant le nom du paramètre dans le corps est d'éviter les avertissements comme
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 disposez de l'instruction suivante:
ud;
Cet avertissement est maintenant supprimé. Cependant maintenant GCC produira n autre avertissement:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
This warning indique que la déclaration ud;
, Tout en étant C syntaxiquement valide, n'affecte rien du tout, et est peut-être une erreur, un peu comme la déclaration
abort;
qui aurait peut-être dû être écrit comme abort();
pour qu'il fasse quelque chose.
Et c'est là que le casting (void)
Entre en jeu - il indiquera au compilateur sans ambiguïté et explicitement que l'instruction est censée n'avoir absolument aucun effet.