|
#include /* Полное сохранение/восстановление контекста ещё и с передачей признака, Func() { теперь в любом месте делаешь если тебе не надо знать причину - то просто
E-mail:
info@telesys.ru
что произошло восстановление и какое именно (эдакий канонический чисто сишный способ сделать нечто похожее на try {} catch {})
*/
jmpbuf FuncJmpBuf;
switch( setjmp( FuncJmpBuf) ) {
case 0: // это мы только что вошли сюда и вернулись из setjmp
break;
case 1: // это мы "вернулись" из longjmp( FuncJmpBuf, 1);
break;
case 10: // это - из longjmp( FuncJmpBuf, 10);
break;
}
}
longjmp( FuncJmpBuf, код_возврата);
и попадаешь в точку, в которую возвращал setjmp()
Это всё для того, чтобы глубоко из кода, вызванного
из Func() быстро вернуться наврех не продираясь сквозь
толпу проверок кода возврата.
Думаю, из прерывания оно тоже отработает, только ты должен
быть уверен, что в прерывание ты попал тогда, когда "основное"
исполнение находится в Func() ниже setjmp()
Func() {
setjmp( FuncJmpBuf);
// пошла твоя функция
}
Ответы