C Standard-Bibliothek

Globale Sprünge: <setjmp.h>


Mit den Vereinbarungen in <setjmp.h> kann man die normale Folge von Funktionsaufruf und -ende umgehen. Typischerweise erlaubt das einen direkten Rücksprung von einem tief verschachtelten Funktionsaufruf.

  int setjmp(jmp_buf env)

Der Makro setjmp speichert Zustandsinformation in env zur Auswertung durch longjmp. Der Resultatwert ist Null, wenn setjmp direkt aufgerufen wird, und von Null verschieden bei einem späteren Aufruf von longjmp. Der Makro setjmp darf nur in bestimmten Kontexten aufgerufen werden, im wesentlichen innerhalb der Bedingung bei if, switch und Schleifen, und nur innerhalb von einfachen Vergleichen.

	if (setjmp(env) == 0)
		/* hierher beim direkten Aufruf */
	else
		/*hierher durch Aufruf von longjmp*/ 


  void longjmp(jmp_buf env, int val)
longjmp stellt den Zustand wieder her, der beim letzten Aufruf von setjmp gespeichert wurde. Dazu wird die Information in env verwendet. Die Ausführung geht so weiter, als ob die Funktion setjmp gerade ausgeführt wurde und den von Null verschiedenen Resultatwert val geliefert hat. Die Funktion, von der aus setjmp aufgerufen wurde, darf noch nicht beendet worden sein. Die erreichbaren Objekte haben dann die Werte, die sie beim Aufruf von longimp hatten. In der Funktion, von der setjmp aufgerufen wurde, sind jedoch die Werte der automatischen Variablen undefiniert, die ohne das Attribut volatile definiert wurden und die seit dem Aufruf von setjmp verändert wurden.


[ Anfang der Seite | Inhaltsverzeichnis | Funktions-Register Header-Register ]

 

15. November 1999, Peter Klingebiel, DVZ