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 setjmpprogram . 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 po longjmp 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średnictwem longjmp , 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 to noexcept, 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 longjmpcatch 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.

Zobacz też

Kontrola procesu i środowiskasetjmp