longjmp
Nach oben zu setjmp.h - Index
Header-Datei
setjmp.h
Kategorie
Verschiedene Routinen
Prototyp
void longjmp(jmp_buf jmpb, int retval);
Beschreibung
Führt ein nicht lokales goto durch.
Ein Aufruf von longjmp stellt den Task-Status wieder her, der durch den letzten Aufruf von setjmp mit dem Argument jmpb erfasst wurde. Die Funktion kehrt dann so zurück, als wäre setjmp mit dem Wert retval zurückgekehrt.
Ein Win32-Task-Status umfasst:
- Registervariablen
- EBX, EDI, ESI
- Stack-Zeiger (ESP)
- Frame-Zeiger (EBP)
- Segmentregister werden nicht gespeichert
- Flags werden nicht gespeichert
Ein Task-Status enthält genügend Informationen, dass mit setjmp und longjmp Unterroutinen implementiert werden können.
setjmp muss vor longjmp aufgerufen werden. Die Routine, die setjmp aufgerufen und jmpb eingerichtet hat, muss aktiv bleiben und darf nicht zurückkehren, bevor longjmp aufgerufen wird. Sollte dies dennoch geschehen, ist das Ergebnis nicht vorhersehbar.
longjmp kann den Wert 0 nicht übergeben.Wird 0 in retval übergeben, ersetzt longjmp den Wert durch 1.
Rückgabewert
Keiner.
Beispiel
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
void subroutine(jmp_buf);
int main(void)
{
int value;
jmp_buf jumper;
value = setjmp(jumper);
if (value != 0)
{
printf("Longjmp with value %d\n", value);
exit(value);
}
printf("About to call subroutine ... \n");
subroutine(jumper);
return 0;
}
void subroutine(jmp_buf jumper)
{
longjmp(jumper,1);
}
Portabilität
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |
+ |
+ |
+ |