Je travaille actuellement sur un projet où les instructions goto sont très utilisées. L'objectif principal des instructions goto est d'avoir une section de nettoyage dans une routine plutôt que de multiples déclarations de retour. Comme ci-dessous :
BOOL foo()
{
BOOL bRetVal = FALSE;
int *p = NULL;
p = new int;
if (p == NULL)
{
cout<<" OOM \n";
goto Exit;
}
// Lot of code...
Exit:
if(p)
{
delete p;
p = NULL;
}
return bRetVal;
}
Cela rend les choses beaucoup plus faciles car nous pouvons suivre notre code de nettoyage à une section du code, c'est-à-dire après l'étiquette Exit.
Cependant, j'ai lu à de nombreux endroits que c'est une mauvaise pratique d'avoir des instructions goto.
Actuellement, je lis le _Code complet_ et il est dit que nous devons utiliser les variables à proximité de leurs déclarations. Si nous utilisons goto, nous devons déclarer/initialiser toutes les variables avant la première utilisation de goto, sinon le compilateur émettra des erreurs indiquant que l'initialisation de xx variables est ignorée par l'instruction goto.
Quel est le bon chemin ?
D'après le commentaire de Scott :
Il semble que l'utilisation de goto pour passer d'une section à l'autre soit mauvaise car elle rend le code difficile à lire et à comprendre.
Mais si nous utilisons goto uniquement pour aller en avant et vers une étiquette, alors cela devrait aller ( ?).
0 votes
Votre extrait de code n'a pas de retour et pas de gotos. Cela rend ton premier paragraphe un peu idiot.
0 votes
Le balisage faisait des choses bizarres - c'est corrigé maintenant.
0 votes
Le sujet donne l'impression d'une question argumentative. Mais je n'ai pas de bonnes oppositions
17 votes
Mes pensées : Décidez du langage que vous utilisez. Le C++ dispose de meilleurs outils pour garantir le clenaup (RAII, comme mentionné ci-dessous), mais pas le C, et en C, l'utilisation de goto de la manière que vous décrivez est très courante.
2 votes
Goto rend le code non sûr à utiliser en présence d'exceptions. Si vous utilisez RIAA, il fera le nettoyage pour vous et sera protégé contre les exceptions.
1 votes
Notez également que le test (p == NULL) n'échouera JAMAIS. Il est toujours garanti que 'p' est un pointeur valide après la fin de new. Si new échoue, il lèvera une exception (à ce moment-là, le reste de votre code fuira).
14 votes
@Martin York : La RIAA ne fera pas votre nettoyage, elle vous poursuivra seulement ;-)
7 votes
Je prie le chien tous les jours pour qu'il répare cela ;-)
0 votes
Goto n'est même pas enseigné dans notre collège.
0 votes
Les compilateurs génèrent de toute façon tout votre code RAII pour vous. L'exemple, cependant, souffre d'une mauvaise gestion des pointeurs. Une fois que vous vous abstrayez d'eux, goto peut être un outil.
0 votes
Ce code me fait mal à l'âme