Question

J'ai récemment rencontré une convention de codage plutôt inhabituelle dans laquelle l'appel à une fonction renvoyant "void" est préfixé avec (void).

par exemple

(void) MyFunction();  

Est-il différent de l'appel de fonction comme:

MyFunction();  

Cela a-t-il un avantage ou est-ce encore un autre inutile, mais il y a une convention de codage d'une certaine sorte?

Était-ce utile?

La solution

Certaines fonctions comme printf () renvoient une valeur qui n'est presque jamais utilisée dans le code réel (dans le cas de printf, le nombre de caractères imprimés). Cependant, certains outils, comme peluche, attendez-vous à ce qu'une fonction renvoie une valeur, elle doit être utilisée, et se plaindra à moins d'écrire quelque chose comme:

int n = printf( "hello" );

Utilisation du casting vide:

(void) printf( "hello" );

est un moyen de dire à ces 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, en tout cas, la plupart des outils vous permettent de les configurer pour ignorer les valeurs de retour à partir de fonctions spécifiques.

Autres conseils

Non, il n'y a pas de différence - ce qui est coulé pour vide est la valeur de retour de la fonction.

Je dirais que cela pourrait vous donner un sens à ce que vous vouliez rendre explicite 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 renvoie quelque chose que le vide pourrait éviter (!) Un avertissement (en fait en aucun cas, je n'ai pu faire en sorte que GCC me prévient que la valeur de retour est perdue) sur certains compilateurs (ou outils de peluche); Mais plus important encore, il est clair qu'une valeur de retour est "jetée" délibérément (et non par erreur).

ACÉDÉMIQUE: Une "fonction" renvoie toujours quelque chose, sinon ce serait une procédure. L'auteur de ce code veut donc dire "Je sais que cette dénomination est fausse, mais je ne changerai pas le nom, donc je rends cette perturbation visible"

Cela a-t-il un avantage ou est-ce encore un autre inutile, mais il y a une convention de codage d'une certaine sorte?

Aucune différence. C'est une convention assez courante, par exemple dans les tests de logiciels pour souligner le fait que dans le contexte, la fonction, le cas échéant, est sûre pour être rejetée.

Dans les pages HPUX man, il est assez courant dans l'exemple de code de voir un casting à vide pour contourner les avertissements de charpie.

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

contre.

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

C'est peut-être d'où vient l'auteur du code. IMO, ce n'est pas une excellente idée car la plupart de la famille Sprintf, par exemple, appelle Malloc. Malloc échouera lorsqu'il n'y a pas assez de mémoire. Sigint provoque également l'interruption du système d'écriture sous-jacent () et de ne pas écrire tout le tampon, pour les membres de la famille printf ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top