Namespaces
Variants

std:: longjmp

From cppreference.net
Utilities library
Défini dans l'en-tête <csetjmp>
void longjmp ( std:: jmp_buf env, int status ) ;
(jusqu'à C++17)
[ [ noreturn ] ] void longjmp ( std:: jmp_buf env, int status ) ;
(depuis C++17)

Charge le contexte d'exécution env sauvegardé par un appel précédent à setjmp . Cette fonction ne retourne pas. Le contrôle est transféré vers le site d'appel de la macro setjmp qui a configuré env . Ce setjmp retourne ensuite la valeur, passée en tant que status .

Si la fonction qui a appelé setjmp a terminé son exécution, le comportement est indéfini (en d'autres termes, seuls les sauts vers le haut de la pile d'appels sont autorisés).

Table des matières

Restrictions supplémentaires en C++

En plus de C longjmp , C++ std::longjmp présente un comportement plus restrictif.

Si le remplacement de std::longjmp par throw et de setjmp par catch devait invoquer un destructeur non trivial pour un objet automatique, le comportement d'un tel std::longjmp est indéfini.

Le comportement est indéfini si std::longjmp est appelé dans une coroutine à un endroit où l'opérateur co_await peut être utilisé.

(depuis C++20)

Paramètres

env - variable faisant référence à l'état d'exécution du programme sauvegardé par setjmp
status - la valeur à retourner depuis setjmp . Si elle est égale à 0 , 1 est utilisé à la place

Valeur de retour

(aucun)

Notes

std::longjmp est le mécanisme utilisé en C pour gérer les conditions d'erreur inattendues où la fonction ne peut pas retourner de manière significative. Le C++ utilise généralement la gestion d'exceptions à cette fin.

Exemple

#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); // Aller au gestionnaire d'erreur
    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("Résolution de {}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))
    {
        // Gestionnaire d'erreur pour le solveur
        std::cout << "Aucune solution réelle\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;
}

Sortie :

Résolution de 1x² + -3x + 2 = 0...
x₁ = 1, x₂ = 2
Résolution de 2x² + -3x + -2 = 0...
x₁ = -0.5, x₂ = 2
Résolution de 1x² + 2x + 3 = 0...
Aucune solution réelle

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 619 C++98 la formulation des restrictions supplémentaires en C++ était vague formulation améliorée
LWG 894 C++98 le comportement était indéfini si le remplacement de
std::longjmp par throw et setjmp par
catch détruisait un objet automatique
le comportement n'est indéfini
que si un destructeur non trivial
pour un objet automatique est invoqué

Voir aussi

sauvegarde le contexte
(macro de fonction)
Documentation C pour longjmp