setjmp
| Definiert in Header <csetjmp>
|
||
#define setjmp(env) /* implementation-defined */
|
||
Speichert den aktuellen Ausführungskontext in einer Variable env vom Typ std::jmp_buf. Diese Variable kann später verwendet werden, um den aktuellen Ausführungskontext durch die Funktion std::longjmp wiederherzustellen. Das heißt, wenn ein Aufruf der Funktion std::longjmp erfolgt, wird die Ausführung an der bestimmten Aufrufstelle fortgesetzt, die die an std::longjmp übergebene Variable std::jmp_buf konstruiert hat. In diesem Fall gibt setjmp den Wert zurück, der an std::longjmp übergeben wurde.
Die Verwendung von setjmp darf nur in einem der folgenden Kontexte erscheinen:
- der gesamte Kontrollausdruck von if, switch, while, do-while, for.
switch (setjmp(env)) { // ...
- ein Operand eines relationalen oder Gleichheitsoperators, wobei der andere Operand ein ganzzahliger konstanter Ausdruck ist und der resultierende Ausdruck der gesamte Kontrollausdruck von if, switch, while, do-while, for ist.
if (setjmp(env) > 0) { // ...
- der Operand eines unären ! Operators, wobei der resultierende Ausdruck der gesamte Kontrollausdruck von if, switch, while, do-while, for ist.
while (!setjmp(env)) { // ...
- der gesamte Ausdruck einer Ausdrucksanweisung (möglicherweise zu
voidgecastet).setjmp(env);
Wenn setjmp in einem anderen Kontext erscheint, ist das Verhalten undefiniert.
|
Zusätzlich ist das Verhalten undefiniert, wenn |
(seit C++20) |
Bei der Rückkehr in den Gültigkeitsbereich von setjmp:
- Alle zugänglichen Objekte, Gleitkomma-Statusflags und andere Komponenten der abstrakten Maschine haben dieselben Werte wie zum Zeitpunkt der Ausführung von std::longjmp,
- mit Ausnahme der nicht-volatile lokalen Variablen in der Funktion, die die Verwendung von
setjmpenthält, deren Werte unbestimmt sind, wenn sie seit demsetjmp-Aufruf geändert wurden.
Parameter
| env | - | Variable zum Speichern des Ausführungszustands des Programms |
Rückgabewert
0 wenn das Makro vom ursprünglichen Code aufgerufen wurde und der Ausführungskontext in env gespeichert wurde.
Nicht-Null-Wert, falls soeben ein nicht-lokaler Sprung ausgeführt wurde. Der Rückgabewert entspricht dem an std::longjmp übergebenen Wert.
Hinweise
Die oben genannten Anforderungen verbieten die Verwendung des Rückgabewerts von
setjmp
im Datenfluss (z.B. um ein Objekt damit zu initialisieren oder zuzuweisen). Der Rückgabewert darf nur entweder in der Kontrollflusssteuerung verwendet oder verworfen werden.
Beispiel
#include <array> #include <cmath> #include <csetjmp> #include <cstdlib> #include <format> #include <iostream> std::jmp_buf solver_error_handler; std::array<double, 2> solve_quadratic_equation(double a, double b, double c) { const double discriminant = b * b - 4.0 * a * c; if (discriminant < 0) std::longjmp(solver_error_handler, true); // Zum Fehlerbehandler springen const double delta = std::sqrt(discriminant) / (2.0 * a); const double argmin = -b / (2.0 * a); return {argmin - delta, argmin + delta}; } void show_quadratic_equation_solution(double a, double b, double c) { std::cout << std::format("Löse {}x² + {}x + {} = 0...\n", a, b, c); auto [x_0, x_1] = solve_quadratic_equation(a, b, c); std::cout << std::format("x₁ = {}, x₂ = {}\n\n", x_0, x_1); } int main() { if (setjmp(solver_error_handler)) { // Fehlerbehandler für den Löser std::cout << "Keine reelle Lösung\n"; return EXIT_FAILURE; } for (auto [a, b, c] : {std::array{1, -3, 2}, {2, -3, -2}, {1, 2, 3}}) show_quadratic_equation_solution(a, b, c); return EXIT_SUCCESS; }
Ausgabe:
Löse 1x² + -3x + 2 = 0... x₁ = 1, x₂ = 2 Löse 2x² + -3x + -2 = 0... x₁ = -0.5, x₂ = 2 Löse 1x² + 2x + 3 = 0... Keine reelle Lösung
Siehe auch
|
springt zu angegebenem Ort
(Funktion) |
|
|
C-Dokumentation
für
setjmp
|
|