std:: longjmp
|
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
|
(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
|
|