> setjmp(jmp ___ buf stackVariables)返回0的用途是什么.这是默认值,我们无法影响.
> setjmp(stackVariables)的唯一意义是在stackVariables中推送堆栈.基本上0告诉我们堆栈是否已成功推送到stack_variables.
>当你从longjmp返回时,它们有一次是非零(任何非零)的值.什么是从lomgjmp返回,何时从longjmp返回,处理异常时.这种设置真的令人困惑.
>有些人可以将它与try / throw和catch联系起来.如果可以提供一些很好的setjmp / longjmp示例,那将会非常棒.
> longJmp是否像throw一样,并且在可以引发异常的地方之后调用它.
谢谢.
解决方法
If the return is from a direct invocation,the setjmp macro returns the value zero. If the
return is from a call to the longjmp function,the setjmp macro returns a nonzero
value.
所以1的答案是零表示你第一次调用setjmp,非零表示它从longjmp返回.
>它推动了当前的程序状态.在longjmp之后,状态恢复,控制返回到它被调用的点,并且返回值不为零.
> C中没有例外.它类似于fork返回不同的值,这取决于您是否处于原始进程中,或者是继承环境的第二个进程,如果您熟悉它.
> C中的try / catch将在throw和catch之间的所有自动对象上调用析构函数. setjmp / longjmp不会调用析构函数,因为它们在C中不存在.所以你可以独立调用任何你在同一时间编写的任何内容.
有了这个附带条件,这个:
#include <stdio.h> #include <setjmp.h> #include <string.h> #include <stdlib.h> void foo ( char** data ) ; void handle ( char* data ) ; jmp_buf env; int main () { char* data = 0; int res = setjmp ( env ); // stored for demo purposes. // in portable code do not store // the result,but test it directly. printf ( "setjmp returned %d\n",res ); if ( res == 0 ) foo ( &data ); else handle ( data ); return 0; } void foo ( char** data ) { *data = malloc ( 32 ); printf ( "in foo\n" ); strcpy ( *data,"Hello World" ); printf ( "data = %s\n",*data ); longjmp ( env,42 ); } void handle ( char* data ) { printf ( "in handler\n" ); if ( data ) { free ( data ); printf ( "data freed\n" ); } }
大致相当于
#include <iostream> void foo ( ) ; void handle ( ) ; int main () { try { foo (); } catch (int x) { std::cout << "caught " << x << "\n"; handle (); } return 0; } void foo ( ) { printf ( "in foo\n" ); std::string data = "Hello World"; std::cout << "data = " << data << "\n"; throw 42; } void handle ( ) { std::cout << "in handler\n"; }
在C情况下,你必须进行显式的内存管理(虽然通常你在调用longjmp之前将它释放到malloc中的函数中,因为它使生活更简单)