Svoboda | Graniru | BBC Russia | Golosameriki | Facebook

Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Альтернативы
Недавние
Show all languages
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Из Википедии — свободной энциклопедии

Стандартная библиотека 
языка программирования С

setjmp.h — заголовочный файл стандартной библиотеки языка Си, объявляющий макросы и тип данных для нелокальных переходов[1]. В Си существует оператор goto, позволяющий переходить в любое место в пределах функции (с некоторыми оговорками), однако переход между функциями с его помощью невозможен.

Типы данных

Библиотека объявляет тип данных jmp_buf, который является массивом и который может использоваться для сохранения и восстановления контекста выполнения программы. Тип не включает в себя информацию о контексте вычислений с плавающей запятой, статусе открытых файлов или иных компонентов[1].

Функции (макросы)

#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);

Стандарт объявляет две функции: setjmp() (может быть макросом) и longjmp(), для сохранения и восстановления контекста, соответственно. Функция setjmp() сохраняет контекст в переменной env и возвращает 0, если это был прямой вызов, или ненулевое значение, если это был возврат из longjmp()[1].

Стандарт запрещает сохранять результат выполнения функции setjmp, накладывая ограничения на место вызова.

Функция longjmp() восстанавливает состояние программы, сохраненное ранее с помощью функции setjmp(), т. е. после успешного вызова longjmp() выполнение программы продолжается, будто бы функция setjmp() просто вернула значение val. Все объекты с неавтоматическим выделением памяти сохраняют своё значение. Также сохраняют своё значение автоматические объекты с квалификатором volatile.

Аргумент val нельзя задать равным нулю. Если аргумент val задан равным нулю, ему автоматически присваивается значение 1. Если функция была вызвана без соответствующего вызова setjmp(), или функция, в которой восстанавливается выполнение, уже завершилась, то поведение не определено.

Использование setjmp() и longjmp() может привести к утечкам памяти, если выделение происходит между вызовами этих функций[1].

Применение

Используются в одном из методов обработки исключений — SJLJ, что расшифровывается как «setjmp/longjmp»[2]. Данный механизм использовался в ранних реализациях исключений C++[3].

Также может применяться в кооперативной многозадачности[4].

Примечания

  1. 1 2 3 4 ISO/IEC 9899:1999. Дата обращения: 4 августа 2011. Архивировано 22 августа 2011 года.
  2. WindowsGCCImprovements - GCC Wiki (англ.). gcc.gnu.org. Дата обращения: 5 января 2019. Архивировано 13 июня 2019 года.
  3. Christophe de Dinechin. C++ Exception Handling for IA-64 (англ.) // www.usenix.org : сайт. — 2000. — 22 October. Архивировано 6 января 2019 года.
  4. The Long Jump (англ.). Dr. Dobb's (11 ноября 2012). Дата обращения: 5 января 2019. Архивировано 6 января 2019 года.
Эта страница в последний раз была отредактирована 29 ноября 2022 в 07:44.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).