В Symbian реализован механизм Leave
в терминах longjmp()
, и он служит хорошим обзором всего, что вам нужно сделать.
В Symbian есть глобальный «стек очистки», который вы нажимаете и высовываете вещи, которые хотите очистить в случае прыжка. Это ручная альтернатива автоматическому разматыванию стека, которое делает компилятор C ++ при возникновении исключения C ++.
У Symbian были «жгуты ловушек», в которые он мог бы выпрыгнуть; они могут быть вложенными.
(Symbian совсем недавно переопределил его в терминах исключений C ++, но интерфейс остается неизменным).
В целом, я думаю, что надлежащие исключения C ++ менее подвержены ошибкам кодирования и намного быстрее, чем переход на собственный эквивалент C.
(Современные компиляторы C ++ отлично справляются с исключениями «ноль накладных расходов», например, когда они не генерируются; longjmp()
должен хранить состояние всех регистров и тому подобное, даже если переход не выполняется позднее, поэтому принципиально никогда не будет так быстро, как исключения.)
Использование C ++ в качестве лучшего C, где вы принимаете только исключения и RAII, было бы хорошим путем, если использование longjmp()
для эмуляции исключений может быть заманчивым.