longjmp
Obnoví prostředí zásobníku a národní prostředí spouštění nastavené voláním setjmp
.
Syntaxe
void longjmp(
jmp_buf env,
int value
);
Parametry
env
Proměnná, ve které je prostředí uloženo.
value
Hodnota, která se má vrátit k setjmp
volání.
Poznámky
Funkce longjmp
obnoví prostředí zásobníku a národní prostředí spouštění, které setjmp
jste dříve uložili .env
setjmp
a longjmp
poskytují způsob, jak provést nelokálnou goto
. Obvykle se používají k předání řízení provádění do zpracování chyb nebo kódu obnovení v dříve volané rutině bez použití normálního volání a návratových konvencí.
Volání, které setjmp
způsobí, že se aktuální prostředí zásobníku uloží do env
. Následné volání pro longjmp
obnovení uloženého prostředí a vrácení ovládacího prvku do bodu bezprostředně za odpovídajícím setjmp
voláním. Provádění se obnoví, jako kdyby value
volání vrátilo setjmp
. Hodnoty všech proměnných (s výjimkou proměnných registru), které jsou přístupné rutině přijímajícího ovládacího prvku, obsahují hodnoty, které měly při longjmp
volání. Hodnoty proměnných registru jsou nepředvídatelné. Hodnota vrácená setjmp
hodnotou musí být nenulová. Pokud value
se předá jako 0, nahradí se hodnota 1 skutečným vrácením.
Specifické pro Microsoft
V kódu Jazyka C++ v systému Windows longjmp
používá stejnou sémantiku stack-unwinding jako kód zpracování výjimek. Je bezpečné použít na stejných místech, kde je možné vytvořit výjimky jazyka C++. Toto použití ale není přenosné a přináší několik důležitých upozornění.
longjmp
Volání pouze před funkcí, která volala setjmp
výsledek, jinak jsou výsledky nepředvídatelné.
Při použití longjmp
dodržujte následující omezení:
Nepředpokládáme, že hodnoty proměnných registru zůstanou stejné. Hodnoty registrovaných proměnných v rutinním volání
setjmp
nemusí být po spuštění obnoveny na správné hodnotylongjmp
.Nepoužívejte
longjmp
k přenosu kontroly z rutiny zpracování přerušení, pokud není přerušení způsobeno výjimku s plovoucí desetinou čárkou. V tomto případě se program může vrátit z obslužné rutiny přerušení,longjmp
pokud nejprve znovu inicializuje matematický balíček s plovoucí desetinou čárkou voláním_fpreset
.Nepoužívejte
longjmp
k přenosu řízení z rutiny zpětného volání vyvolané přímo nebo nepřímo kódem Windows.Pokud je kód zkompilován pomocí /EHs nebo /EHsc a funkce, která obsahuje
longjmp
volání, jenoexcept
, pak místní objekty v této funkci nemusí být destrukovány během odvíjení zásobníku.
END Microsoft Specific
Poznámka:
V přenosném kódu C++ nemůžete předpokládat setjmp
a longjmp
podporovat sémantiku objektů jazyka C++. Konkrétně má setjmp
/longjmp
dvojice volání nedefinované chování, pokud nahradí setjmp
a longjmp
zavolá catch
throw
všechny ne-triviální destruktory pro všechny automatické objekty. V programech C++ doporučujeme použít mechanismus zpracování výjimek jazyka C++.
Další informace naleznete v tématu Použití setjmp a longjmp.
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
longjmp |
<setjmp.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
Podívejte se na příklad pro _fpreset
.