Il y a des moments lors de l'utilisation d' goto
est en fait le DROIT de réponse - au moins pour ceux qui ne sont pas éduqués dans la foi religieuse,"goto
peut-être jamais la réponse, peu importe ce que la question est" - et c'est l'un de ces cas.
Ce code est d'utiliser le hack de do { ... } while(0);
pour le seul but de s'habiller un goto
comme break
. Si vous allez utiliser goto
, puis être ouvert à ce sujet. Il n'est point de rendre le code plus DIFFICILE à lire.
Une situation particulière est seulement quand vous avez beaucoup de code assez complexe de conditions:
void func()
{
setup of lots of stuff
...
if (condition)
{
...
...
if (!other condition)
{
...
if (another condition)
{
...
if (yet another condition)
{
...
if (...)
...
}
}
}
....
}
finish up.
}
Il peut le faire plus clair que le code est correct de ne pas avoir une telle logique complexe.
void func()
{
setup of lots of stuff
...
if (!condition)
{
goto finish;
}
...
...
if (other condition)
{
goto finish;
}
...
if (!another condition)
{
goto finish;
}
...
if (!yet another condition)
{
goto finish;
}
...
....
if (...)
... // No need to use goto here.
finish:
finish up.
}
Edit: Pour préciser, je ne suis en aucun cas suggérant l'utilisation d' goto
comme une solution générale. Mais il y a des cas où l' goto
est une solution meilleure que les autres solutions.
Imaginez par exemple que nous sommes de la collecte de certaines données, et les différentes conditions testées sont une sorte de "c'est la fin des données recueillies" - qui dépend d'une sorte de "continuer" marqueurs qui varient selon l'endroit où vous êtes dans le flux de données.
Maintenant, quand nous aurons terminé, nous avons besoin d'enregistrer les données dans un fichier.
Et oui, il y a souvent d'autres solutions que peut offrir une solution raisonnable, mais pas toujours.