setjmp/longjmp to mechanizm umożliwiający niskopoziomową kontrolę sterowania w języku C bez uciekania się do asemblera. Może być używany np. do implementacji wyjątków.
Użycie Należy wywołać funkcję setjmp z argumentem wskazującym bufor skoku. Funkcja wróci zwracając wartość 0. Następnie jeśli użyjemy funkcji longjmp podając jej jako argumenty bufor skoku i wartość do zwrócenia, sterowanie zostanie przekazane ponownie do miejsca powrotu odpowiadającej funkcji setjmp:
jmp_buf jbuf;
void foo() { if (setjmp(jbuf) != 0)
printf("world!\n"); } else { printf("Hello, "); longjmp(jbuf, 1);
W powyższym przykładzie wydrukowane zostanie Hello, world!\n.
Ponieważ często chcemy skakać pomiędzy funkcjami, bufor jest zwykle zmienną globalną. Typ jmp_buf jest typem wskaźnikowym, więc do funkcji setjmp i longjmp przekazujemy jbuf nie &jbuf.
Bufor skoku staje się nieaktualny po wyjściu z funkcji, z której wywołaliśmy setjmp.
Nagłówki int setjmp(jmp_buf env); void longjmp (jmp_buf env, int val);
Funkcja jest opisana w standardzie POSIX.
Przykład W poniższym przykładzie użyjemy funkcji setjmp i longjmp do implementacji tablic, które zwracają wyjątek w przypadku próby dostępu poza granice tablicy.
#include <setjmp.h> #include <stdio.h> #include <stdlib.h>