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.
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] .
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] .
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] .