Difference between revisions of "Goto"
(fix typo, update URL to gitlab) |
(→See also: insert Exit) |
||
Line 29: | Line 29: | ||
== See also == | == See also == | ||
− | + | * [[Exit|<syntaxhighlight lang="delphi" inline>exit</syntaxhighlight>]] | |
* [[sGoto|<syntaxhighlight lang="pascal" inline>{$goto}</syntaxhighlight> compiler directive]] | * [[sGoto|<syntaxhighlight lang="pascal" inline>{$goto}</syntaxhighlight> compiler directive]] | ||
* {{Doc|package=RTL|unit=system|identifier=longjmp|text=<syntaxhighlight lang="pascal" inline>system.longJmp</syntaxhighlight>}} | * {{Doc|package=RTL|unit=system|identifier=longjmp|text=<syntaxhighlight lang="pascal" inline>system.longJmp</syntaxhighlight>}} | ||
[[Category: Code]] | [[Category: Code]] |
Latest revision as of 01:36, 25 January 2022
│
Deutsch (de) │
English (en) │
français (fr) │
русский (ru) │
goto
is an unconditional jump to a previously declared label
(either before or after the goto
command).
It is a reserved word.
Usage of goto
in high-level programming languages such as Pascal is highly discredited, since control structures of all sorts are available.
The last situation a goto
is agreed with bad grace to be a significant system error, where a “graceful exit” is better than causing a system breakdown.
As an example, here an excerpt from FPC’s code base rtl/inc/extres.inc]:
324procedure InitResources;
328label ExitErrMem, ExitErrFile, ExitNoErr;
329begin
339 ResHeader:=GetMem(sizeof(TExtHeader));
340 if ResHeader=nil then goto ExitErrFile;
366 goto ExitNoErr;
367
368 ExitErrMem:
369 FreeMem(ResHeader);
370 ResHeader:=nil;
371 ExitErrFile:
372 {$I-}
373 Close(fd);
374 {$I+}
375 ExitNoErr:
376end;
According to the value of returnNilIfGrowHeapFails
getMem
possibly may return nil
.
Instead of placing everything in a “success”-branch, a couple goto
instructions were chosen.