Nécessité de préfixer une fonction avec (void)

Je suis récemment tombé sur une convention de codage plutôt inhabituelle dans laquelle l’appel d’une fonction renvoyant “void” est précédé de (void).

par exemple

(void) MyFunction(); 

Est-ce différent de l’appel de fonction comme:

 MyFunction(); 

At-il un avantage ou est-ce encore une autre convention de codage inutile ou inutile?

Certaines fonctions telles que printf () renvoient une valeur qui n’est presque jamais utilisée dans du code réel (dans le cas de printf, le nombre de caractères imprimés). Cependant, certains outils, tels que lint , s’attendent à ce que si une fonction renvoie une valeur, elle doit être utilisée et se plaindra à moins que vous n’écriviez quelque chose comme:

 int n = printf( "hello" ); 

en utilisant la fonte vide:

 (void) printf( "hello" ); 

est une façon de dire à de tels outils que vous ne voulez vraiment pas utiliser la valeur de retour, les gardant ainsi silencieux. Si vous n’utilisez pas de tels outils, vous n’avez pas besoin de vous déranger et, dans tous les cas, la plupart des outils vous permettent de les configurer pour ignorer les valeurs de retour de fonctions spécifiques.

Non, il n’y a pas de différence – ce qui est converti en void est la valeur de retour de la fonction.

Je dirais que cela pourrait signifier que vous vouliez expliciter que vous n’utilisez pas la valeur de retour (vous l’appelez pour les effets secondaires), mais comme la fonction a déjà un retour à vide, cela n’a pas beaucoup de sens .

Si la fonction retourne quelque chose, le vide pourrait éviter (!) Un avertissement (en effet, j’ai été incapable de faire en sorte que gcc me prévienne que la valeur de retour est perdue) sur certains compilateurs (ou outils lint); mais plus important encore, il est clair qu’une valeur de retour est “jetée” à dessein (et non par erreur).

Acedémiquement: une “fonction” retourne toujours quelque chose, sinon ce serait une procédure. Donc, l’auteur de ce code veut dire “je sais que cette dénomination est fausse, mais je ne changerai pas le nom, donc je rend cette perturbation visible”

At-il un avantage ou est-ce encore une autre convention de codage inutile ou inutile?

Aucune différence. C’est une convention assez courante, par exemple dans les tests de logiciels, de souligner le fait que dans le contexte, le retour de fonction, le cas échéant, peut être supprimé en toute sécurité.

Dans les pages de manuel HPUX, il est assez courant, dans l’exemple de code, de voir un transtypage à annuler pour contourner les avertissements de peluche.

 fprintf(mystream, "%s\n", "foo"); 

contre.

 (void)fprintf(mystream, "%s\n", "foo"); 

C’est peut-être d’où vient l’auteur du code. OMI, ce n’est pas une bonne idée car la plupart des membres de la famille sprintf, par exemple, appellent malloc. Malloc échouera s’il n’y a pas assez de mémoire. SIGINT force également le call-call write () sous-jacent à interrompre et non à écrire tout le tampon, pour les membres de la famille printf ().