Домашняя страница библиотеки_c AVR

Синтаксис языка C

Библиотека языка C GNU glibc

 Страницы развития библиотеки_с AVR

Главная страница

Инструкция пользователя

Содержание библиотеки_c

Часто задаваемые вопросы

Содержание по алфавиту

Демонстрационные проекты


<setjmp.h>: Нелокальный goto


Детальное Описание

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


Документация Функций

void longjmp

(

jmp_buf 

__jmpb,

 

 

 

int 

__ret

 

 

)

 

 

 

Нелокальный переход к сохраненному контексту стека.

 #include <setjmp.h>

longjmp() восстанавливает среду, сохраненную последним запросом setjmp() с передачей параметра __jmpb. По завершении longjmp(), выполнение программы продолжается как будто соответствующий запрос setjmp () всего лишь возвратил значение __ret..

Примечание:

longjmp() не может возвратить 0. Если longjmp() вызвана со вторым параметром 0, то вместо 0 будет возвращена 1.

Параметры:

 

__jmpb 

Информация, сохраненная предыдущим запросом к setjmp().

 

__ret 

Значение, для возврата к вызывающей программе setjmp().

Возвращение:

Эта функция никогда не возвращается.

int setjmp

(

jmp_buf 

__jmpb

 ) 

 

Сохраняет контекст стека на нелокальный goto.

 #include <setjmp.h>

setjmp() сохраняет контекст/среду стека в __jmpb для последующего использования его longjmp(). Контекст стека будет лишен законной силы, если функция, которая вызвала setjmp () возвращена.

Параметры:

 

__jmpb 

Переменная типа jmp_buf которая содержит информацию стека так, что среда может быть восстановлена.

Возвращение:

setjmp() возвращает 0 при непосредственном возвращении, и не ноль при возвращении из longjmp() использование сохраненного контекста.


Automatically generated by Doxygen 1.5.2 on 21 Dec 2007.

Hosted by uCoz