Udostępnij za pośrednictwem


Używanie polecenia setjmp i longjmp

Gdy zestawjmp i longjmp są używane razem, zapewniają one sposób na wykonanie pliku innego niż lokalny goto. Są one zwykle używane w kodzie C do przekazywania kontroli wykonywania do obsługi błędów lub kodu odzyskiwania w wcześniej nazywanej rutynowej bez używania standardowych konwencji wywoływania lub zwracania.

Uwaga

Ponieważ setjmp i longjmp nie obsługują poprawnego zniszczenia obiektów ramek stosu przenośnie między kompilatorami języka C++, a ponieważ mogą one obniżyć wydajność, uniemożliwiając optymalizację zmiennych lokalnych, nie zalecamy ich używania w programach języka C++. Zalecamy użycie konstrukcji try i catch zamiast tego.

Jeśli zdecydujesz się używać funkcji setjmp i longjmp w programie C++, dołącz <również setjmp.h> lub <setjmpex.h> , aby zapewnić prawidłową interakcję między funkcjami a obsługą wyjątków strukturalnych (SEH) lub obsługą wyjątków języka C++.

Specyficzne dla firmy Microsoft

Jeśli używasz /EH opcji do skompilowania kodu C++, destruktory dla obiektów lokalnych są wywoływane podczas odwijania stosu. Jeśli jednak używasz /EHs lub /EHsc do skompilowania i jednej z funkcji, które używają wywołań longjmpnoexcept, destruktor odwijania dla tej funkcji może nie wystąpić, w zależności od stanu optymalizatora.

W kodzie przenośnym longjmp , gdy jest wykonywane wywołanie, poprawne zniszczenie obiektów opartych na ramce nie jest jawnie gwarantowane przez standard i może nie być obsługiwane przez inne kompilatory. Aby poinformować setjmp Cię o tym, na poziomie ostrzeżenia 4 wywołanie powoduje ostrzeżenie C4611: interakcja między "_setjmp" i zniszczeniem obiektów C++ nie jest przenośna.

END Microsoft Specific

Zobacz też

Połączenie wyjątków języka C (strukturalnych) i C++