Namespaces
Variants

std::longjmp

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (déconseillé en C++20)
 
 
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é au site d'appel de la macro setjmp qui a configuré env. Ce setjmp retourne alors la valeur passée comme status.

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

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

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