Setjmp.h

setjmp.h  er header-filen for standard C - biblioteket , der erklærer makroer og datatype for ikke-lokale spring [1] . Der er en goto-sætning i C , der giver dig mulighed for at hoppe hvor som helst i en funktion (med nogle forbehold), men du kan ikke bruge den til at hoppe mellem funktioner.

Datatyper

Biblioteket erklærer en datatype, jmp_bufder er et array , og som kan bruges til at gemme og gendanne programmets eksekveringskontekst. Typen inkluderer ikke information om flydende komma -konteksten , status for åbne filer eller andre komponenter [1] .

Funktioner (makroer)

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

Standarden erklærer to funktioner: setjmp()(kan være en makro) og longjmp()til henholdsvis at gemme og gendanne konteksten. Funktionen setjmp()gemmer konteksten i env- variablen og returnerer 0, hvis det var et direkte kald, eller en værdi, der ikke er nul, hvis det var en retur fra longjmp()[1] .

Standarden forbyder at gemme resultatet af setjmp-funktionen, hvilket pålægger begrænsninger på stedet for opkaldet.

Funktionen longjmp() returnerer udførelse til kalderen setjmp()med værdien val. Alle manuelle hukommelsesobjekter bevarer deres værdi. Automatiske objekter med kvalifikationen bevarer også deres værdi volatile.

Hvis funktionen blev kaldt uden et tilsvarende kald setjmp()til , eller hvis funktionen, som udførelsen gendannes i, allerede er afsluttet, er adfærden udefineret.

Brug af setjmp()og longjmp()kan føre til hukommelseslækager, hvis allokering sker mellem opkald til disse funktioner [1] .

Ansøgning

De bruges i en af ​​undtagelseshåndteringsmetoderne  - SJLJ, som står for "setjmp/longjmp" [2] . Denne mekanisme blev brugt i tidlige implementeringer af C++ undtagelser [3] .

Det kan også bruges i cooperativ multitasking [4] .

Noter

  1. 1 2 3 4 ISO/IEC 9899:1999 . Hentet 4. august 2011. Arkiveret fra originalen 22. august 2011.
  2. ↑ WindowsGCCimprovements - GCC Wiki  . gcc.gnu.org. Hentet 5. januar 2019. Arkiveret fra originalen 13. juni 2019.
  3. Christophe de Dinechin. C++ Undtagelseshåndtering for IA-64  //  www.usenix.org : websted. - 2000. - 22. oktober. Arkiveret fra originalen den 6. januar 2019.
  4. Længdespringet  . _ Dr. Dobb's (11. november 2012). Hentet 5. januar 2019. Arkiveret fra originalen 6. januar 2019.