Хотя Язык 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.