web-dev-qa-db-fra.com

Pourquoi convertir une valeur de paramètre de fonction inutilisée en vide?

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?

91
bastibe

Il est là pour éviter les avertissements du compilateur car certains paramètres ne sont pas utilisés.

82
Benoit Thiery

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.

10
Antti Haapala