日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

setjump和longjump

發布時間:2023/12/2 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 setjump和longjump 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
int setjmp( jmp_buf env ); void longjmp( jmp_buf env, int value ); #???? setjmp(j)設置“jump”點,用正確的程序上下文填充jmp_buf 對象j。這個上下文包括程序存放位置、棧和框架指針,其它重要的寄存器和內存數據。當初始化完jump 的上下文,setjmp()返回0 值。setjmp函數的調用時,會保存程序當前的堆棧環境到env參數中; #?????????? ? 以后調用longjmp(j,r)的效果就是一個“長跳轉”到由j 描述的上下文處(也就是到那原來設置j 的setjmp()處)。當作為長跳轉的目標而被調用時,setjmp()返回r 或1(如果r 設為0 的話)。(記住,setjmp()不能在這種情況時返回0。    ????? 通常, 用longjmp()來終止異常,用setjmp()標記相應的異常處理程序, 在調用setjmp的函數返回之前,調用longjmp,否則結果不可預料。   在使用longjmp時,請遵守以下規則或限制: $???? 不要假象寄存器類型的變量將總會保持不變。在調用longjmp之后,通過setjmp所返回的控制流中,例程中寄存器類型的變量將不會被恢復。 $???? 不要使用longjmp函數,來實現把控制流,從一個中斷處理例程中傳出,除非被捕獲的異常是一個浮點數異常。在后一種情況下,如果程序通過調用_fpreset函數,來首先初始化浮點數包后,它是可以通過longjmp來實現從中斷處理例程中返回。 $???? C++程序中,小心對setjmplongjmp的使用,應為setjmplongjmp并不能很好地支持C++中面向對象的語義。因此在C++程序中,使用C++提供的異常處理機制將會更加安全。? #include ? <conio.h> ? ? #include ? <setjmp.h> ? ? void ? RaiseException ( jmp_buf ? jmpbuf) ? ? { ? ? ? printf( ? "Press ? a ? key ? to ? restore ? stack ? environment...\n" ? ) ? ; ? ? ? getch() ? ; ? ? ? longjmp(jmpbuf, 1); ? } ? ? int ? main() ? ? { ? ? ? jmp_buf ? jmpbuf ? ; ? int ? result? ; ? ? ?? printf( ? "Save ? stack ? environment...\n" ? ) ? ; ? ? ? ?result ? = ? setjmp(jmpbuf) ? ; ? if( result? == ? 0? ) ? { ?//Do something ?//If anything wrong. ?RaiseException(jmpbuf)? ; ? } else// the exception handler, return by longjump, non-zero value { ? ? ? ???? printf( ? "longjump() ? returned ? %d.\n", ? result ? ) ? ; ? ? ? ???? exit(0) ? ; ? } ? ? ? return ? 0 ? ; ? ? } ? 程序輸出將是如下序列:? ? Saving ? stack ? environment... ? ? Call ? MyFunc()... ? ? Press ? a ? key ? torestore ? stack ? environment... ? setjmp() ? returned ? 1 //Example 2 #include <stdio.h> #include <setjmp.h> jmp_buf save; void main() { ?char c; ?for (;; ) { ??? switch ( setjmp( save ))? { ???? case 0: printf ( "Zero returned from setjmp on setup.\n\n");??? break;???? ?????? ?? ???? case 1: printf ( "NORMAL PROGRAM OPERATION\n\n" );????? break; ???? case 2: printf ( "WARNING\n\n" );????? break; ???? case 3: ?printf ( "FATAL ERROR PROGRAM TERMINATED\n\nReally Terminate? y/n: " ); ???? ?????????????????? fflush ( stdout );??????????? ??????????????????????? scanf ( "%1s", &c ); ???? ????????????????? c ?= tolower ( c );?? ???? if ( c == 'y' ) return ( 1 ); ???? ?????????????????? ??printf ( "\n" ); ????? break; ???? ???default:?? ?? printf ( "Should never return here.\n" );????? break; ??? } ?? ?process (); ?} } void process () { ?int i; ?printf ( "Input a number to simulate an error condition: " ); ?fflush ( stdout );?scanf ( "%d", &i );?i %= 3; ?i++;????????? ????? ?longjmp ( save, i); }

總結

以上是生活随笔為你收集整理的setjump和longjump的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。