Хотя Язык C и имеет страшную инструкцию goto, но она может использоваться только, для перехода к метке только внутри одной и той же (локальной) функции. Чтобы перейти к другой (нелокальной) функции, библиотека c обеспечивает функции setjmp() и longjmp(). Они являются полезными для того, чтобы иметь дело с ошибками и прерываниями, с которыми сталкиваются в подпрограмме нижнего уровня.
Примечание:
setjmp() и longjmp() делают программы трудно читаемыми. По возможности, должна использоваться альтернатива.
longjmp() может уничтожить изменения, сделанные с глобальными регистровыми переменным (см. Как на постоянно поместить переменную в конкретный регистр?).
Для очень
детального
обсуждения setjmp()/longjmp(), см.
Глава 7 из Advanced Programming in the UNIX Environment, by W. Richard Stevens.
Пример:
#include <setjmp.h>
jmp_buf env; int main (void) {if (setjmp (env))
{ ... handle error ... } while (1) { ... main processing loop which calls foo() some where ... } } ... void foo (void) { ... blah, blah, blah ... if (err)
{ longjmp (env, 1); } }|
|
|
Функции |
|
|
int |
setjmp (jmp_buf __jmpb) |
|
void |
longjmp
(jmp_buf __jmpb, int __ret) __ATTR_NORETURN__ |
Нелокальный переход к сохраненному контексту стека.
#include <setjmp.h>
longjmp() восстанавливает среду, сохраненную последним запросом setjmp() с передачей параметра __jmpb. По завершении longjmp(), выполнение программы продолжается как будто соответствующий запрос setjmp () всего лишь возвратил значение __ret..
Примечание:
longjmp() не может возвратить 0. Если longjmp() вызвана со вторым параметром 0, то вместо 0 будет возвращена 1.
Параметры:
|
|
__jmpb |
Информация, сохраненная предыдущим запросом к setjmp(). |
|
|
__ret |
Значение, для возврата к вызывающей программе setjmp(). |
Возвращение:
Эта
функция
никогда не
возвращается.
Сохраняет контекст стека на нелокальный goto.
#include <setjmp.h>
setjmp() сохраняет контекст/среду стека в __jmpb для последующего использования его longjmp(). Контекст стека будет лишен законной силы, если функция, которая вызвала setjmp () возвращена.
Automatically generated by Doxygen
1.5.2 on 21 Dec 2007.