с ассемблером дел никогда не имел, но насколько я понимаю, для использования longjmp нужно знать куда (в какую функция) «прыгать». как же может сторонняя библиотека знать об этом — получать указатель на «коллбэк»-функцию, в которую осуществлять «прыжок»? или я всё в корне неправильно понимаю?
да, и можно примерчик, чтобы посмотреть как это работает?
Можно глянуть в С++ reference (хороший справочник). А есть и в Qt, т.к. используется libJPG а там longjmp (в примечаниях тролли неоднократно ноют об отсутствии авто-деструкторов
)
Сам "прыжок" - дело нехитрое. Есть глобальные переменные (сохраненные при вызове setjmp). Это
- адрес самого кода (точки на которую спрыгнуть), получить просто LEA
- значение регистра стека
Просто установили стек да передали управление "длинным jump'ом". Как бы "зачеркнуть всю жизнь да сначала начать". Ну а что там произошло "в старой жизни" - память распределили, файлы открыли и.т.п. - то уже разбирайтесь сами как это все зачистить.
Конечно, exception куда приятнее, но мне кажется оно не дает того понимания как работает машина, и это важно. Хотя возможно все это лишь ностальгия старого пердуна