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 pour annuler servent-ils un but?
(void)
pour un effet quelque peu différent. Cette question concerne CRéponses:
Il est là pour éviter les avertissements du compilateur car certains paramètres sont inutilisés.
la source
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
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:
Cet avertissement est maintenant supprimé. Cependant maintenant GCC produira un autre avertissement:
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'instructionce 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.la source