Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Zusätzliche Laufzeitfunktionen

&pagelevel(5)&pagelevel

Zusätzlich zu den Laufzeitfunktionen, die durch den Sprachstandard definiert sind, bietet das C++-Laufzeitsystem weitere nützliche Funktionen an, mit denen Programme verlässlicher gestaltet werden können. Allerdings sind Programme, die diese Funktionen verwenden, nicht ANSI-C++-konform und deshalb nicht portabel.
Es handelt sich um die Funktionen unwind_exit, get_caught_object_typeidcan_throw und can_rethrow.
Sie sind alle Bestandteil des Namensraums _SNI_extensions.

Ebenfalls im Namensraum _SNI_extensions definert ist der für die Argumente verwendete Datentyp EO_flag_set

Datentyp EO_flag_set

Der Datentyp EO_flag_set wird verwendet um Eigenschaften eines Ausnahmeobjekts anzuzeigen.
EO_flag_set ist in dem Sprachmodus C++ V3 anders definiert als in C++ 2017 oder C++ 2020.

EO_flag_set im Sprachmodus C++ 2017 und C++ 2020

Im C++ 2017- und C++ 2020-Sprachmodus ist EO_flag_set folgendermaßen definiert:

namespace _SNI_extensions {
      typedef unsigned int EO_flag_set;
}

Folgende Flag-Werte sind für Datenfelder vom Typ EO_flag_set definiert:

EO_NO_FLAGS             : kein Zeigertyp / kein Flag gesetzt
EO_IS_POINTER           : Zeigertyp
EO_POINTER_TO_CONST     : Zeiger auf konstantes Objekt
EO_POINTER_TO_VOLATILE  : Zeiger auf flüchtiges Objekt
EO_LAST                 : letztes Element eines Flag-Arrays

EO_flag_set im Sprachmodus C++ V3

Im C++ V3-Sprachmodus ist EO_flag_set folgendermaßen definiert:

namespace _SNI_extensions {
      typedef unsigned char EO_flag_set;
}

Folgende Bit-Werte sind für Datenfelder vom Typ EO_flag_set definiert:

EO_NO_FLAGS             : kein Zeigertyp
EO_IS_POINTER           : Zeigertyp
EO_POINTER_TO_CONST     : Zeiger auf konstantes Objekt
EO_POINTER_TO_VOLATILE  : Zeiger auf flüchtiges Objekt

unwind_exit - Stack vor der Programmbeendigung abbauen

Die Funktion unwind_exit dient, ähnlich wie exit, zur Beendigung eines Programms. Im Unterschied zu exit werden beim Aufruf von unwind_exit vor der Programmbeendigung die folgenden zusätzlichen Aktionen durchgeführt:

  • die Destruktion aller noch nicht gelöschten automatic Objekte auf dem Laufzeitstack

  • die Destruktion aller noch nicht beendeten Ausnahmeobjekte

Anschließend erfolgt analog zu exit die Destruktion der globalen Objekte.

Eine Destruktion noch nicht freigegebener Objekte auf dem Heap erfolgt jedoch weder durch exit noch durch unwind_exit.

Wird ein von unwind_exit aufgerufener Destruktor mit einer Ausnahme beendet, so wird implizit terminate aufgerufen. Es ist daher ratsam, im terminate_handler ebenfalls unwind_exit aufzurufen. Dadurch ist garantiert, dass in jedem Fall nach und nach die Destruktoren für alle automatic- und Ausnahme-Objekte aufgerufen werden. Eine Endlosschleife kann dabei nicht entstehen.

Die Funktion unwind_exit kann, wie auch exit, von jeder Stelle des Programms aus aufgerufen werden, insbesondere in einer Beendigungsbehandlung (terminate_handler). Als Argument wird ihr, analog und mit gleicher Wirkung wie bei exit, ein Exit-Status mitgegeben.

Der Prototyp der Funktion unwind_exit ist in der Header-Datei <exception> deklariert:

#include <exception>
namespace _SNI_extensions {
      void unwind_exit(int status);
}

get_caught_object_typeid - Ermittlung des Typs abgefangener Ausnahmeobjekte

Mit der Funktion get_caught_object_typeid kann der Typ eines abgefangenen Ausnahmeobjekts ermittelt werden. Geliefert wird der Typ des jüngsten abgefangenen und noch nicht beendeten Ausnahmeobjekts. Falls kein abgefangenes und noch nicht beendetes Ausnahmeobjekt existiert, wird eine Ausnahme vom Typ bad_typeid geworfen (throw).

Die Funktion get_caught_object_typeid kann in einer beliebigen Behandlungsroutine (terminate_handler, unexpected_handler, catch(...) {...}) aufgerufen werden, um Informationen über den Typ des abgefangenen Ausnahmeobjekts zu erhalten. Dies kann die Diagnose von Programmablauf-Fehlern erleichtern.

Die Klasse type_info und der Prototyp der Funktion get_caught_object_typeid sind in der Header-Datei <typeinfo> deklariert.

Die Funktion get_caught_object_typeid ist in dem Sprachmodus C++ V3 anders definiert als in C++ 2017 oder C++ 2020.

get_caught_object_typeid im Sprachmodus C++ 2017 und C++ 2020

Der Prototyp der Funktion get_caught_object_typeid ist in der Header-Datei <typeinfo> folgendermaßen deklariert:

#include <typeinfo>
namespace _SNI_extensions {
      const type_info &get_caught_object_typeid(EO_flag_set *pflags, EO_flag_set **ppflags);
}

Die beiden Argumente dienen der Rückgabe von Informationen, ob es sich um bei dem Typ um einen Zeiger handelt oder nicht. Bei Werten von Null wird keine Information zurückgegeben.

Das Verhalten hängt davon ab, ob der Typ kein Zeiger ist, ein einfacher Zeiger oder ein Zeiger auf einen Zeiger.

Ist der Typ kein Zeiger, so wird er als Referenz auf ein type_info Objekt geliefert. *pflags erhält den Wert EO_NO_FLAGS. *ppflags erhält den Wert Null.

Ist der Typ ein einfacher Zeiger, so wird der Typ des Objekts, auf das der Zeiger zeigt, als Referenz auf ein type_info Objekt geliefert . *pflags erhält einen der Werte EO_IS_POINTER, (EO_IS_POINTER | EO_POINTER_TO_CONST), (EO_IS_POINTER | EO_POINTER_TO_VOLATILE) oder (EO_IS_POINTER | EO_POINTER_TO_CONST | EO_POINTER_TO_VOLATILE) je nachdem, ob der Zeiger konstant und/oder flüchtig ist. *ppflags erhält den Wert Null.

Ist der Typ ein Zeiger auf einen Zeiger-Typ, so wird die Kette der Zeiger verfolgt, bis ein Objekt erreicht wird, welches kein Zeiger ist. Der Typ dieses Objekts wird als Referenz auf ein type_info Objekt geliefert. *pflags erhält den Wert EO_NO_FLAGS. Es wird ein Array angelegt, der pro Zeiger ein Element hat. Die Elemente zeigen an, ob der Zeiger dieser Stufe konstant und/oder flüchtig ist. Dabei werden die Flag-Werte EO_POINTER_TO_CONST und EO_POINTER_TO_VOLATILE genutzt. Der Flag-Wert EO_IS_POINTER wird nicht verwendet. Das letzte Element des Arrays enthält zusätzlich den Flag-Wert EO_LAST. *ppflags wird auf die Adresse dieses Arrays gesetzt.

Ein Beispiel: für den Typ "volatile char * *const *" wird der Array { EO_POINTER_TO_CONST, EO_NO_FLAGS, EO_POINTER_TO_VOLATILE|EO_LAST } gebildet.


get_caught_object_typeid im Sprachmodus C++ V3

Der Prototyp der Funktion get_caught_object_typeid ist in der Header-Datei <typeinfo> folgendermaßen deklariert:

#include <typeinfo>
namespace _SNI_extensions {
      const type_info &get_caught_object_typeid(EO_flag_set *pflags);
}

Wenn der Typ des abgefangenen Ausnahmeobjekts kein Zeigertyp ist, wird er als Referenz auf ein type_info Objekt geliefert. Falls das Ausnahmeobjekt von einem Zeigertyp ist, so wird der Typ des Objekts, auf das der Zeiger zeigt, geliefert. Ist das der Funktion get_caught_object_typeid übergebene Argument ungleich Null, so wird es als Adresse interpretiert, bei der hinterlegt wird, ob das abgefangene Objekt von einem Zeigertyp ist, und falls ja, welche Typ-Attribute für das Objekt gelten, auf das der Zeiger zeigt (Werte siehe oben). Wird zum Beispiel ein const char * geworfen, so wird die typeid von char zurückgegeben und *pflags erhält den Wert (EO_IS_POINTER | EO_POINTER_TO_CONST).

can_throw - Prüfen auf terminate oder unexpected beim Werfen eines Objekts

Die Funktion can_throw (Prädikat) prüft, ob ein Ausnahmeobjekt des angegebenen Typs geworfen werden kann, ohne dass dies zum Aufruf von terminate oder unexpected führt.

#include <typeinfo>
namespace _SNI_extensions {
    bool can_throw(const std::type_info &typeid_to_check,
                   EO_flag_set flags = EO_NO_FLAGS);
}

typeid_to_check muss ein Nicht-Zeigertyp eines Ausnahmeobjekts sein.

Mit flags kann angegeben werden, ob der tatsächlich zu überprüfende Typ des Ausnahmeobjekts ein Zeigertyp ist und ob er mit den Typ-Attributen const oder volatile versehen ist (Werte siehe oben).

Wenn das Argument flags nicht angegeben wird, ist EO_NO_FLAGS (kein Zeigertyp) voreingestellt.

can_rethrow - Prüfen auf terminate oder unexpected beim Weiterwerfen eines Objekts

Die Funktion can_rethrow (Prädikat) prüft, ob ein Ausnahmeobjekt weitergeworfen werden kann (throw;), ohne dass dies zum Aufruf von terminate oder unexpected führt.

#include <typeinfo>
namespace _SNI_extensions {
    bool can_rethrow(void); 
}