2010-06-03 10 views
1

Possible en double:
Examples of good gotos in C or C++Quelles sont les utilisations acceptables de goto?

Quelles sont les utilisations de l'instruction goto considérez-vous acceptable? Je discute de quelques directives de codage pour le travail embarqué C, et je me demande s'il y a des cas où goto est la façon la plus propre de faire les choses.

+0

une lecture intéressante à ce sujet est [Programmation structurée avec aller à Statements] (http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf), par D. Knuth. Il a été écrit en 1974, mais contient toujours des exemples et des pensées intéressantes. – tonio

Répondre

1

Pour C, je trouve utile d'utiliser goto pour un point de sortie commun dans certaines fonctions. Si vous avez besoin de libérer des ressources avant de revenir, c'est bien de faire retval = -ERROR; goto fn_exit; au lieu d'essayer de sortir de plusieurs couches de boucles for/while. Certains diront que ce n'est pas nécessaire dans un code bien conçu - lorsque vous atteignez un point où l'utilisation de goto est attrayante, vous devez diviser la fonction en plusieurs sous-fonctions. Peut-être que c'est vrai dans certains cas, mais si vous devez passer plusieurs variables, ou passer des pointeurs vers des variables afin qu'une sous-fonction puisse mettre à jour ces valeurs, j'ai l'impression que vous avez ajouté des complications inutiles.

Voici une question de SO récente sur using goto for error management. Je suis sûr que la navigation sur le goto tag vous apportera encore plus de réponses.

0

J'ai trouvé qu'il y a pas mal d'endroits où goto pourrait simplifier la logique. Ma règle est que les 2 goto ne se chevauchent pas et que le goto et son étiquette sont 'proches'; généralement, pas plus de 30 lignes de distance.

Habituellement, quand j'ai une condition complexe que je dois vérifier beaucoup de choses, un goto pourrait aider:

if (condition1 && cond2) 
    if (checkFile(file)) 
    goto DONE; 
else 
    if (condition3) 
    goto DONE; 

handleError(); 
return 0; 

DONE: 
...do something... 
return 1; 
+0

Je peux penser à des solutions plus élégantes * sans * goto, donc ce n'est pas un argument fort. Par exemple en créant une fonction 'int done()', et en remplaçant 'goto DONE' par' return done() '. Il y a presque toujours un meilleur moyen que de recourir à goto. – Clifford

+0

@Clifford vous avez raison, mon exemple ci-dessus est très simpliste; mais c'est le point: l'utilisation de goto que je propose est pour la logique complexe, qui n'est pas facilement démontrée par un exemple simple. Maintenant, dans quelques problèmes complexes, j'ai trouvé qu'un simple goto est plus direct et clair quant à ce que l'intention est meilleure que d'autres solutions. – Gianni

+0

@Clifford proposez-vous plusieurs instructions de retour dans une fonction donnée? – simon

0

Mon opinion personnelle est qu'il n'y a pas des utilisations acceptables de l'instruction goto dans une programmation moderne la langue. "Déclaration GOTO considérée comme nuisible", par le regretté Edsger W. Dijkstra, fait un bon travail de couverture de la question. Ce document devrait être une lecture obligatoire pour tous les développeurs de logiciels sur la planète.

Il est à noter que la langue gitane, du groupe de Don Good à l'UT Austin à la fin des années 1970, n'avait pas de goto. Il est à noter qu'Ichbiah et al. Ont seulement inclus un goto dans Ada parce que le DoD l'exigeait, explicitement, dans tant de mots dans la spécification des exigences. Je me souviens d'avoir lu qu'Ichbiah et son équipe avaient délibérément rendu la syntaxe de l'étiquette cible aussi moche que possible, pour que les étiquettes se détachent comme des pouces douloureux et découragent l'utilisation du goto.

Questions connexes