Copyright (C) 2000-2012 |
GNU Info (libc.info)Non-Local DetailsDetails of Non-Local Exits ========================== Here are the details on the functions and data structures used for performing non-local exits. These facilities are declared in `setjmp.h'. - Data Type: jmp_buf Objects of type `jmp_buf' hold the state information to be restored by a non-local exit. The contents of a `jmp_buf' identify a specific place to return to. - Macro: int setjmp (jmp_buf STATE) When called normally, `setjmp' stores information about the execution state of the program in STATE and returns zero. If `longjmp' is later used to perform a non-local exit to this STATE, `setjmp' returns a nonzero value. - Function: void longjmp (jmp_buf STATE, int VALUE) This function restores current execution to the state saved in STATE, and continues execution from the call to `setjmp' that established that return point. Returning from `setjmp' by means of `longjmp' returns the VALUE argument that was passed to `longjmp', rather than `0'. (But if VALUE is given as `0', `setjmp' returns `1'). There are a lot of obscure but important restrictions on the use of `setjmp' and `longjmp'. Most of these restrictions are present because non-local exits require a fair amount of magic on the part of the C compiler and can interact with other parts of the language in strange ways. The `setjmp' function is actually a macro without an actual function definition, so you shouldn't try to `#undef' it or take its address. In addition, calls to `setjmp' are safe in only the following contexts: * As the test expression of a selection or iteration statement (such as `if', `switch', or `while'). * As one operand of a equality or comparison operator that appears as the test expression of a selection or iteration statement. The other operand must be an integer constant expression. * As the operand of a unary `!' operator, that appears as the test expression of a selection or iteration statement. * By itself as an expression statement. Return points are valid only during the dynamic extent of the function that called `setjmp' to establish them. If you `longjmp' to a return point that was established in a function that has already returned, unpredictable and disastrous things are likely to happen. You should use a nonzero VALUE argument to `longjmp'. While `longjmp' refuses to pass back a zero argument as the return value from `setjmp', this is intended as a safety net against accidental misuse and is not really good programming style. When you perform a non-local exit, accessible objects generally retain whatever values they had at the time `longjmp' was called. The exception is that the values of automatic variables local to the function containing the `setjmp' call that have been changed since the call to `setjmp' are indeterminate, unless you have declared them `volatile'. automatically generated by info2www version 1.2.2.9 |