Setjmp.h

setjmp.h  är rubrikfilen för standard C - biblioteket , som deklarerar makron och datatyp för icke-lokala hopp [1] . Det finns en goto-sats i C som låter dig hoppa var som helst inom en funktion (med vissa varningar), men du kan inte använda den för att hoppa mellan funktioner.

Datatyper

Biblioteket deklarerar en datatyp jmp_bufsom är en array och som kan användas för att spara och återställa programmets exekveringskontext. Typen inkluderar inte information om flyttalskontexten , status för öppna filer eller andra komponenter [1] .

Funktioner (makron)

#include <setjmp.h> int setjmp ( jmp_buf env ) ; void longjmp ( jmp_buf env , int val ) ;

Standarden deklarerar två funktioner: setjmp()(kan vara ett makro) och longjmp(), för att spara respektive återställa sammanhanget. Funktionen setjmp()lagrar kontexten i variabeln env och returnerar 0 om det var ett direktanrop, eller ett värde som inte är noll om det var en retur från longjmp()[1] .

Standarden förbjuder att spara resultatet av setjmp-funktionen, vilket innebär begränsningar för platsen för samtalet.

Funktionen longjmp() returnerar exekvering till anroparen setjmp()med värdet val. Alla manuella minnesobjekt behåller sitt värde. Automatiska objekt med kvalet behåller också sitt värde volatile.

Om funktionen anropades utan ett motsvarande anrop setjmp()till , eller om funktionen där exekveringen återställs redan har avslutats, är beteendet odefinierat.

Användning av setjmp()och longjmp()kan leda till minnesläckor om allokering sker mellan anrop till dessa funktioner [1] .

Applikation

De används i en av undantagshanteringsmetoderna  - SJLJ, som står för "setjmp/longjmp" [2] . Denna mekanism användes i tidiga implementeringar av C++-undantag [3] .

Det kan också användas i kooperativ multitasking [4] .

Anteckningar

  1. 1 2 3 4 ISO/IEC 9899:1999 . Hämtad 4 augusti 2011. Arkiverad från originalet 22 augusti 2011.
  2. ↑ WindowsGCCI-förbättringar - GCC Wiki  . gcc.gnu.org. Hämtad 5 januari 2019. Arkiverad från originalet 13 juni 2019.
  3. Christophe de Dinechin. C++ Undantagshantering för IA-64  //  www.usenix.org : webbplats. - 2000. - 22 oktober. Arkiverad från originalet den 6 januari 2019.
  4. Längdhoppet  . _ Dr. Dobb's (11 november 2012). Hämtad 5 januari 2019. Arkiverad från originalet 6 januari 2019.