longjmp
Przywraca środowisko stosu i ustawienia regionalne wykonywania ustawione przez wywołanie setjmp
.
Składnia
void longjmp(
jmp_buf env,
int value
);
Parametry
env
Zmienna, w której jest przechowywane środowisko.
value
Wartość, która ma zostać zwrócona do wywołania setjmp
.
Uwagi
Funkcja longjmp
przywraca środowisko stosu i ustawienia regionalne wykonywania wcześniej zapisane w programie env
przez setjmp
program . setjmp
i longjmp
zapewniają sposób wykonywania nielokalnego goto
; są one zwykle używane do przekazywania kontroli wykonywania do obsługi błędów lub kodu odzyskiwania w wcześniej wywoływanej procedurze bez używania normalnych konwencji wywołania i powrotu.
Wywołanie metody setjmp
powoduje zapisanie bieżącego środowiska stosu w programie env
. Kolejne wywołanie w celu longjmp
przywrócenia zapisanego środowiska i zwraca kontrolę do punktu bezpośrednio po odpowiednim setjmp
wywołaniu. Wykonanie jest wznawiane tak, jakby value
zostało zwrócone przez wywołanie setjmp
. Wartości wszystkich zmiennych (z wyjątkiem zmiennych rejestru), które są dostępne dla rutynowej kontrolki odbierania, zawierają wartości, które miały podczas longjmp
wywoływana. Wartości zmiennych rejestru są nieprzewidywalne. Wartość zwracana przez setjmp
element musi być niezerowa. Jeśli value
wartość jest przekazywana jako 0, wartość 1 jest zastępowana w rzeczywistym zwracaniu.
Specyficzne dla firmy Microsoft
W kodzie języka Microsoft C++ w systemie Windows longjmp
używa tej samej semantyki odwijania stosu co kod obsługi wyjątków. Można bezpiecznie używać w tych samych miejscach, w których można zgłaszać wyjątki języka C++. Jednak to użycie nie jest przenośne i wiąże się z pewnymi ważnymi zastrzeżeniami.
Wywołaj wywołanie longjmp
tylko przed funkcją, która wywołała setjmp
funkcję zwraca. W przeciwnym razie wyniki są nieprzewidywalne.
Obserwowanie następujących ograniczeń w przypadku korzystania z programu longjmp
:
Nie zakładaj, że wartości zmiennych rejestru pozostaną takie same. Wartości zmiennych rejestru w rutynowym wywołaniu
setjmp
mogą nie zostać przywrócone do odpowiednich wartości polongjmp
wykonaniu.Nie należy używać
longjmp
do przenoszenia kontroli z procedury obsługi przerwań, chyba że przerwanie jest spowodowane wyjątkiem zmiennoprzecinkowych. W takim przypadku program może wrócić z programu obsługi przerwań za pośrednictwemlongjmp
, jeśli najpierw ponownie inicjuje pakiet matematyczny zmiennoprzecinkowa, wywołując polecenie_fpreset
.Nie należy używać
longjmp
do transferu kontroli z procedury wywołania zwrotnego wywoływanej bezpośrednio lub pośrednio przez kod systemu Windows.Jeśli kod jest kompilowany przy użyciu /EHs lub /EHsc, a funkcja zawierająca
longjmp
wywołanie tonoexcept
, lokalne obiekty w tej funkcji mogą nie być zdestrukturowane podczas odwijania stosu.
END Microsoft Specific
Uwaga
W przenośnym kodzie C++ nie można zakładać setjmp
i longjmp
obsługiwać semantyki obiektów C++. W szczególności setjmp
/longjmp
para wywołań ma niezdefiniowane zachowanie, jeśli zastąpi element setjmp
i longjmp
catch
przez i throw
wywoła wszelkie nietrywialne destruktory dla jakichkolwiek obiektów automatycznych. W programach języka C++ zalecamy użycie mechanizmu obsługi wyjątków języka C++.
Aby uzyskać więcej informacji, zobacz Using setjmp and longjmp (Używanie polecenia setjmp i longjmp).
Wymagania
Procedura | Wymagany nagłówek |
---|---|
longjmp |
<setjmp.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
Zobacz przykład dla elementu _fpreset
.