Sdílet prostřednictvím


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é setjmpjste 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í longjmpdodrž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é hodnoty longjmp .

  • 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í, je noexcept, 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á catchthrow 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.

Viz také

Řízení procesů a prostředísetjmp