netlib.narod.ru< Назад | Оглавление | Далее >

B8. Дальние переходы: <setjmp.h>

Объявления в <setjmp.h> предоставляют способ отклониться от обычной последовательности «вызов — возврат»; типичная ситуация — необходимость вернуться из «глубоко вложенного» вызова функции на верхний уровень, минуя промежуточные возвраты.


int setjmp(jmp_buf env);

Макрос setjmp сохраняет текущую информацию о вызовах в env для последующего ее использования в longjmp. Возвращает нуль, если возврат осуществляется непосредственно из setjmp, и не нуль, если — от последующего вызова longjmp. Обращение к setjmp возможно только в определенных контекстах, в основном это проверки в if, switсh и циклах, причем только в простых выражениях отношения.

       if (setjmp() == 0)
           /* после прямого возврата */
       else
           /* после возврата из longjmp */

void longjmp(jmp_buf env, int val);

longjmp восстанавливает информацию, сохраненную в самом последнем вызове setjmp, по информации из env; выполнение программы возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val. Результат будет непредсказуемым, если в момент обращения к longjmp функция, содержащая вызов setjmp, уже завершила работу и осуществила возврат. Доступные ей объекты имеют те значения, которые они имели в момент обращения к longjmp; setjmp не сохраняет значений.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz