6.5 Нелокальные переходы
GCC предоставляет встроенные функции __builtin_setjmp и __builtin_longjmp, которые похожи на, но не взаимозаменяемы с, функциями библиотеки C setjmp и longjmp. Встроенные версии используются внутри библиотек GCC для реализации обработки исключений на некоторых целевых платформах. В пользовательском коде следует использовать стандартные функции библиотеки C, объявленные в <setjmp.h>, вместо встроенных.
Встроенные версии этих функций используют стандартные механизмы GCC для сохранения и восстановления регистров с помощью стека при входе и выходе из функций. Аргумент буфера перехода buf содержит только информацию, необходимую для восстановления кадра стека, а не весь набор сохранённых значений регистров.
Важным замечанием является то, что GCC организует сохранение и восстановление только тех регистров, которые известны конкретному варианту архитектуры, для которого компилируется код. Это может сделать __builtin_setjmp и __builtin_longjmp более эффективными, чем их аналоги из библиотеки в некоторых случаях, но также может привести к некорректной и неясной работе при смешивании с кодом, использующим весь набор регистров.
Вы должны объявить аргумент буфера перехода buf для встроенных функций следующим образом:
#include <stdint.h> intptr_t buf[5];
- Встроенная функция: int __builtin_setjmp (intptr_t *buf)
Эта функция сохраняет текущий контекст стека в buf.
__builtin_setjmpвозвращает 0 при прямом возвращении и 1 при возвращении из__builtin_longjmpс использованием того же buf.
- Встроенная функция: void __builtin_longjmp (intptr_t *buf, int val)
-
Эта функция восстанавливает контекст стека в buf, сохранённый предыдущим вызовом
__builtin_setjmp. После завершения__builtin_longjmp, выполнение программы возобновляется так, как если бы соответствующее__builtin_setjmpвернуло значение val, которое должно быть 1.Поскольку
__builtin_longjmpполагается на механизм возврата функции для восстановления контекста стека, его нельзя вызывать из той же функции, которая вызывает__builtin_setjmpдля инициализации buf. Его можно вызывать только из функции, которая вызывается (прямо или косвенно) из функции, вызывающей__builtin_setjmp.
Далее: Создание вызовов, Предыдущее: Вложенные функции, Вверх: Расширения C [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Nonlocal-Gotos.html