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>