Difference between revisions of "Goto"

From Lazarus wiki
Jump to navigationJump to search
(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.

See also