Partager via


longjmp

Restaure l’environnement de pile et les paramètres régionaux d’exécution définis par un setjmp appel.

Syntaxe

void longjmp(
   jmp_buf env,
   int value
);

Paramètres

env
Variable dans laquelle l’environnement est stocké.

value
Valeur à retourner à l’appel setjmp.

Notes

La fonction longjmp restaure un environnement de pile et des paramètres régionaux d’exécution enregistrés dans env par setjmp. setjmpet longjmp fournissent un moyen d’exécuter un non local goto; ils sont généralement utilisés pour passer le contrôle d’exécution à la gestion des erreurs ou code de récupération dans une routine précédemment appelée sans utiliser les conventions normales d’appel et de retour.

Quand setjmp est appelé, l’environnement de pile actuel est enregistré dans env. Un appel ultérieur à longjmp restaure l’environnement enregistré et retourne le contrôle au point qui suit immédiatement l’appel setjmp correspondant. L’exécution reprend comme si value elle avait été retournée par l’appel setjmp . Les valeurs de toutes les variables (sauf les variables de Registre) qui sont accessibles à la routine qui reçoit le contrôle contiennent les valeurs qu’elles avaient quand longjmp a été appelé. Les valeurs des variables de Registre sont imprévisibles. La valeur retournée par setjmp doit être différente de zéro. Si value elle est passée sous la forme 0, la valeur 1 est remplacée dans le retour réel.

Section spécifique à Microsoft

Dans le code Microsoft C++ sur Windows, longjmp utilise la même sémantique de déroulement de pile que le code de gestion des exceptions. Il est sûr d’utiliser dans les mêmes endroits que les exceptions C++ peuvent être déclenchées. Toutefois, cette utilisation n’est pas portable et est fournie avec quelques mises en garde importantes.

longjmp Appelez uniquement avant la fonction qui a appelé setjmp les retours ; sinon, les résultats sont imprévisibles.

Respectez les restrictions suivantes quand vous utilisez longjmp :

  • Ne partez pas du principe que les valeurs des variables de registre restent identiques. Les valeurs des variables de Registre dans la routine qui appelle setjmp peuvent ne pas être restaurées aux valeurs appropriées après l’exécution de longjmp.

  • N’utilisez longjmp pas pour transférer le contrôle hors d’une routine de gestion des interruptions, sauf si l’interruption est due à une exception à virgule flottante. Dans ce cas, un programme peut retourner à partir d’un gestionnaire d’interruption par le biais de longjmp s’il réinitialise tout d’abord le package mathématique à virgule flottante en appelant _fpreset.

  • N’utilisez longjmp pas pour transférer le contrôle à partir d’une routine de rappel appelée directement ou indirectement par le code Windows.

  • Si le code est compilé à l’aide de /EHs ou /EHsc et que la fonction qui contient l’appel est noexcept, les objets locaux de cette fonction peuvent ne pas être destructeurs pendant le déroulement de la longjmp pile.

FIN de la section spécifique à Microsoft

Remarque

Dans le code C++ portable, vous ne pouvez pas supposer setjmp et longjmp prendre en charge la sémantique d’objet C++. Plus précisément, une paire d’appels a un setjmp/longjmp comportement non défini si elle remplace le setjmp et longjmp par catch et throw appelle tous les destructeurs non trivials pour tous les objets automatiques. Dans les programmes C++, nous vous recommandons d’utiliser le mécanisme de gestion des exceptions C++.

Pour plus d’informations, consultez Utilisation de setjmp et longjmp.

Spécifications

Routine En-tête requis
longjmp <setjmp.h>

Pour plus d’informations sur la compatibilité, consultez Compatibility.

Exemple

Consultez l’exemple pour _fpreset.

Voir aussi

Processus et contrôle d’environnementsetjmp