В первую очередь, это точно про C, никаких решений на C ++ не требуется.
Цель: возврат к вызывающей функции (A
) за пределами нескольких фреймов стека.
У меня есть несколько решений, но ни одно из них не кажется лучшим вариантом.
Самый простой в смысле реализации - longjmp / setjmp, но я не уверен, уничтожает ли он автоматические переменные, потому что, как указано в wiki, нормальное разматывание стека не происходит, если выполняется longjmp.
Вот краткое описание потока программы: функция A
вызывает функцию file processing
, что приводит к множеству внутренних и рекурсивных вызовов. В какой-то момент программа чтения файлов встречает EOF, поэтому работа file processing
выполнена, и управление должно быть передано функции A
.
Сравнивая каждый прочитанный символ с EOF или '\ 0'? Нет, спасибо. UPD: я могу избежать динамического выделения памяти в цепочке вызовов между setjmp и longjmp.
Не будучи уверенным в автоматических переменных, я не знаю, что произойдет при последовательных вызовах file processing
(файлов больше 1).
So:
1) Что насчет "без раскрутки стека" от longjmp? Насколько опасно, что у меня есть все держатели данных (указатели).
2) Другие изящные и эффективные способы вернуться к A
фрейму?
setjmp()
или (например) не выделяли память во время выполнения. Если это сложно, как вы говорите, вы можете обнаружить, что регистрация и отмена регистрации этих очисток не проще, чем более традиционная модель. Нередко можно найти программы на C, которые на 50% обрабатывают ошибки, особенно при работе с файловым вводом-выводом. - person Persixty   schedule 02.01.2015