Namespaces
Variants

std:: longjmp

From cppreference.net
Utilities library
Definiert im Header <csetjmp>
void longjmp ( std:: jmp_buf env, int status ) ;
(bis C++17)
[ [ noreturn ] ] void longjmp ( std:: jmp_buf env, int status ) ;
(seit C++17)

Lädt den Ausführungskontext env , der durch einen vorherigen Aufruf von setjmp gespeichert wurde. Diese Funktion kehrt nicht zurück. Die Steuerung wird an die Aufrufstelle des Makros setjmp übertragen, das env eingerichtet hat. Jenes setjmp gibt dann den Wert zurück, der als status übergeben wurde.

Wenn die Funktion, die setjmp aufgerufen hat, beendet wurde, ist das Verhalten undefiniert (mit anderen Worten, nur Long Jumps den Aufrufstapel hinauf sind erlaubt).

Inhaltsverzeichnis

Zusätzliche Einschränkungen in C++

Zusätzlich zu C longjmp hat C++ std::longjmp eingeschränktere Verhaltensweisen.

Wenn das Ersetzen von std::longjmp durch throw und setjmp durch catch einen nicht-trivialen Destruktor für ein automatisches Objekt aufrufen würde, ist das Verhalten eines solchen std::longjmp undefiniert.

Das Verhalten ist undefiniert, wenn std::longjmp in einer Coroutine an einer Stelle aufgerufen wird, wo der co_await Operator verwendet werden könnte.

(since C++20)

Parameter

env - Variable, die auf den durch setjmp gespeicherten Programmausführungszustand verweist
status - Der von setjmp zurückzugebende Wert. Wenn dieser gleich 0 ist, wird stattdessen 1 verwendet

Rückgabewert

(keine)

Hinweise

std::longjmp ist der Mechanismus, der in C verwendet wird, um unerwartete Fehlerzustände zu behandeln, bei denen die Funktion nicht sinnvoll zurückkehren kann. C++ verwendet dafür im Allgemeinen Exception-Handling .

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 619 C++98 die Formulierung der zusätzlichen Einschränkungen in C++ war vage die Formulierung verbessert
LWG 894 C++98 das Verhalten war undefiniert, wenn das Ersetzen
std::longjmp durch throw und setjmp durch
catch ein automatisches Objekt zerstören würde
das Verhalten ist nur undefiniert
wenn ein nicht-trivialer Destruktor für
ein automatisches Objekt aufgerufen wird

Siehe auch

speichert den Kontext
(Funktionsmakro)
C-Dokumentation für longjmp