This question already has an answer here:
- Examples of good gotos in C or C++ [closed] 16 answers
I know lots of questions about why not use goto
, why goto
is bad practice, why goto
was create by devil, why the fingers of those who type goto
should be ripped off, etc...
And in many answers to this questions , this question, and even at wikipedia it's possible to find reasons pro / against goto
.
Even Stackoverflow has a goto
tag :)
But, obviously, goto
is accepted as a valid command, otherwise your compiler / interpreter wouldn't know what to do with it. Even in C / C++ it's possible to use goto
, and that language even has a formal, ISO specification.
So, probably, there should be some case where only by using goto
it's possible to accomplish some task. Then, why and when should a goto
be used in C / C++ ?
Edit:
Just to make sure:
1 - this question doesn't require debate. It should be answerable: giving one or more cases where goto
is the only solution, or stating no, it's always possible to avoid a goto
. Of course, I'm not the only who can decide whether it should be closed or not, but I don't think that "too broad, asks for debate, etc" are reasons to close it.
2 - There might be some cases where goto
make the code cleaner, faster, etc. I don't want those. I want to know if there exists one case where goto
is the only solution (no, it's not a dup of that "give good examples of goto" question)
3 - I'll accept any downvote, with a smile on my face, if the downvote is justified. But I'm pretty sure that this question has an answer and has done previous research about the subject. Downvoting simple because those 4-letters taboo word that starts with a "G" was used... sorry...
The only reason I use a goto is when it is for an error return condition from a function that needs some common cleanup. The target of the goto is near the end of the function and the "normal" return returns before the label.
There is no circumstance under which a
goto
is strictly necessary: you can always avoid it if you really want to, but to do that for purely idealogical reasons is a mistake.For example, a friend of mine wrote a wavelet transform function that had (something like) 15 nested loops. In the event of an error in those loops, he had a
goto
to a cleanup block just before the function'sreturn
statement. To achieve the same effect without a goto would have involved setting a flag and testing it at every loop level, which would have made his code far less readable. In these circumstances,goto
was the right choice.Here is an example where only goto will work: https://stackoverflow.com/a/245801/193848
Basically if you have multiple nested
for
loops, the only way to break out of all the loops from an inner loop is with agoto
statement (since unlike some other languages the Cbreak
keyword doesn't support a parameter for the number of nesting levels to break out).The latest MISRA standard now allows gotos.
A good example where gotos make sense is when you have a large routine with a lot of exits points. You can have many return statements (not good) convolute the code with 'structured programming' conditionals (also not good) or a "goto Done; which sends the program to a set of ending statements before returning.
The MISRA standard basically allows gotos for these sort of circumstances. I think 'only downward' is one of their criteria.