setjmp
宏 <csetjmp>
int setjmp (jmp_buf env);
为跳转保留呼叫环境
这个函数形式的宏用有关代码执行点的调用环境的当前状态的信息填充env,
以便以后调用longjmp可以恢复它。
使用env中存储的信息调用longjmp可以恢复相同的状态,
并将控制返回到相同的点(调用setjmp),该点将被设置为一个特定的非零值。
调用环境的状态包括所有可访问对象的值,除了函数本地的自动持续时间对象,
这些对象没有volatile-qualified的类型,并且在调用longjmp之前发生了更改;它们有不确定的值。
setjmp的调用本身必须是一个表达式语句,或者在选择或迭代语句中作为(可能被否定)
整个控制表达式进行计算,或者与整数常量表达式进行比较。否则,它将导致未定义的行为。
☲ 参数
env
类型为jmp_buf的对象,其中存储环境信息。
☉ 返回值
这个宏可能会返回不止一次:第一次,直接调用;在这种情况下,它总是返回0。
当调用longjmp并将信息设置为env时,该宏再次返回;如果这个值不等于0,
这次它返回传递给longjmp的值作为第二个参数,如果是0则返回1。
☣ 示例
/* setjmp example: error handling */
#include <stdio.h> /* printf, scanf */
#include <stdlib.h> /* exit */
#include <setjmp.h> /* jmp_buf, setjmp, longjmp */
main()
{
jmp_buf env;
int val;
val = setjmp (env);
if (val) {
fprintf (stderr,"Error %d happened",val);
exit (val);
}
/* code here */
longjmp (env,101); /* signaling an error */
return 0;
}
|
该函数使用setjmp设置一个捕获点,稍后longjmp可以调用该捕获点来发出错误信号。
输出:
Error 101 happened
↭ 数据竞争
setjmp和longjmp的作用域仅限于当前线程。
➤ 异常(C++)
不抛出保证:这个宏从不抛出异常。
🍄 另请参阅