«Автоматические переменные» - это старый термин для обычных (не объявляемых с помощью регистра или статических) локальных переменных, который восходит к терминологии, используемой в стандарте C, и первоначальному значению ключевого слова auto
.См. Разделы 6.2.4 и 6.7.1 стандарта
Что касается этого:
, но тогда остальные функции не могут полагаться на своипеременные в стеке после longjmp возвращаются к нему, что кажется сумасшедшим
Идея состоит в том, что вы не должны изменять их в первую очередь, если вы собираетесь использовать longjmp, потому что тогда вы не можете знать,Что должно случиться.
Причина заключается в том, что longjmp может восстанавливать состояние, такое как регистры процессора, которым автоматические переменные могли быть сопоставлены (нет гарантии, что они будут в «стеке» или в памятии даже если они существуют в памяти, некоторые операции могут (если только они не объявлены как энергозависимые) не имеют прямого доступа к памяти, но могут получить доступ к регистру процессора, в который уже загружено значение)
Ваш вопросэто немного странно, потому что это означает, что вы хотите их восстановить [т.е. ваши изменения во промежуточных функциях должны быть удалены] - в общем, это предостережение о том, что они могут быть восстановлены аварией когда это не ожидается.«Не восстановлено» не означает «непригодный для использования» [хотя стандарт DOES объявляет их непригодными для использования, поскольку он может восстановить кэшированный регистр, но не память, поэтому вы получите противоречивые результаты], это означает «имеет значение, записанное в более поздней функции»это (потому что вы передали адрес, предназначенный для его записи) ".