Namensräume
Varianten
Aktionen

setjmp

Von cppreference.com
< cpp‎ | utility‎ | program
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
Definiert in Header <csetjmp>
#define setjmp(env) /* implementierungsabhängig */

Speichert den aktuellen Ausführungskontext in einer Variablen env vom Typ std::jmp_buf. Diese Variable kann später verwendet werden, um den aktuellen Ausführungskontext mit der Funktion std::longjmp wiederherzustellen. Das heißt, wenn ein Aufruf der Funktion std::longjmp erfolgt, wird die Ausführung an derjenigen Stelle fortgesetzt, an der die Variable std::jmp_buf, die an std::longjmp übergeben wurde, erstellt wurde. In diesem Fall gibt setjmp den Wert zurück, der an std::longjmp übergeben wurde.

Die Invokation von setjmp muss nur in einem der folgenden Kontexte erscheinen

  1. der gesamte Kontrollausdruck eines if, switch, while, do-while, for.
    switch (setjmp(env)) { // ...
  2. ein Operand eines relationalen oder Gleichheitsoperators, wobei der andere Operand ein ganzzahliger Konstantausdruck ist und der resultierende Ausdruck der gesamte Kontrollausdruck eines if, switch, while, do-while, for ist.
    if (setjmp(env) > 0) { // ...
  3. der Operand eines unären !-Operators, wobei der resultierende Ausdruck der gesamte Kontrollausdruck eines if, switch, while, do-while, for ist.
    while (!setjmp(env)) { // ...
  4. der gesamte Ausdruck einer Ausdrucksanweisung (möglicherweise in void gecastet).
    setjmp(env);

Wenn setjmp in einem anderen Kontext erscheint, ist das Verhalten undefiniert.

Zusätzlich ist das Verhalten undefiniert, wenn setjmp in einer Coroutine an einer Stelle aufgerufen wird, an der der Operator co_await verwendet werden kann.

(seit C++20)

Bei der Rückkehr in den Gültigkeitsbereich von setjmp

  • haben alle zugänglichen Objekte, Gleitkomma-Statusflags und andere Komponenten der abstrakten Maschine dieselben Werte wie zum Zeitpunkt der Ausführung von std::longjmp,
  • mit Ausnahme der nicht-volatile lokalen Variablen in der Funktion, die den Aufruf von setjmp enthält, deren Werte indeterminate sind, wenn sie seit dem Aufruf von setjmp geändert wurden.

Inhalt

[bearbeiten] Parameter

env - Variable zum Speichern des Programmzustands

[bearbeiten] Rückgabewert

0, wenn das Makro vom Originalcode aufgerufen wurde und der Ausführungskontext in env gespeichert wurde.

Ein Wert ungleich Null, wenn gerade ein nicht-lokaler Sprung durchgeführt wurde. Der Rückgabewert ist derselbe wie der an std::longjmp übergebene Wert.

[bearbeiten] Hinweise

Die oben genannten Anforderungen verbieten die Verwendung des Rückgabewerts von setjmp im Datenfluss (z. B. zur Initialisierung oder Zuweisung eines Objekts damit). Der Rückgabewert darf nur entweder im Kontrollfluss verwendet oder verworfen werden.

[bearbeiten] 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); // Go to error handler
 
    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("Solving {}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))
    {
        // Error handler for solver
        std::cout << "No real solution\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

Solving 1x² + -3x + 2 = 0...
x₁ = 1, x₂ = 2
 
Solving 2x² + -3x + -2 = 0...
x₁ = -0.5, x₂ = 2
 
Solving 1x² + 2x + 3 = 0...
No real solution

[bearbeiten] Siehe auch

springt zur angegebenen Position
(funktion) [bearbeiten]
C-Dokumentation für setjmp