Użycie funkcji setjmp/longjmp
Gdy setjmp i longjmp są używane razem, zapewniają sposób wykonania nielokalnych goto.Są one zazwyczaj używane do przekazywania formantów wykonywania do kodu obsługi błędów lub odzyskiwania w poprzednio wywołanej procedurze bez użycia standardowej konwencji wywołania lub konwencji zwracania.
Przestroga |
---|
Jednakże, ponieważ mechanizmy setjmp i longjmp nie obsługują semantyki obiektów języka C++ i ponieważ mogą one zmniejszyć wydajność poprzez zapobieganie optymalizacji w zmiennych lokalnych, zalecamy, aby nie używać ich w programach w języku C++.Firma Microsoft zaleca użycie try/catch zamiast konstrukcji. |
Jeśli użytkownik zdecyduje się użyć funkcji setjmp/longjmp w programie w języku C++, należy również dodać nagłówek SETJMP.H lub SETJMPEX.H, aby zapewnić poprawne interakcji między funkcjami i obsługą wyjątków w języku C++.Jeśli używasz opcji /EH do kompilowania, destruktory obiektów lokalnych są wywoływane podczas odwijania stosu.Jeśli używasz /EHs do kompilacji, a jedna z funkcji wywołuje funkcję, która korzysta ze stałej nothrow, a funkcja, która używa stałej nothrow wywołuje funkcję longjmp, odwijanie przez destruktora może nie występować, w zależności od optymalizatora.
W kodzie przenośnym, gdy nielokalne goto wywołania longjmp są wykonywane, prawidłowe niszczenie obiektów opartych na klatkach może być zawodne.