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
. setjmp
et 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 delongjmp
.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 delongjmp
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 lalongjmp
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
.