我想了解setjmp的下面的代碼:什麼setjmp的在這個例子做
是什麼線setjpg()是什麼意思?
32 if (setjmp(sk_err.fJmpBuf)) {
33 return false;
34 }
我想了解setjmp的下面的代碼:什麼setjmp的在這個例子做
是什麼線setjpg()是什麼意思?
32 if (setjmp(sk_err.fJmpBuf)) {
33 return false;
34 }
setjmp
保存上下文來longjmp
未來的呼叫。直接調用它時返回零(所以,這裏繼續執行jpeg_create_compress
)。當稍後調用longjmp
(它必須在當前函數返回之前,但它可以處於任意調用深度)時,執行將直接返回到setjmp
調用,並恢復,就好像setjmp
返回給longjmp
的任何內容。據推測,在這種情況下,longjmp
將被調用一個非零值,因此該方法將直接返回false
。
看看上下文,它看起來像用於錯誤處理。我認爲longjmp
可以在以下compress
期間被調用。把它看作低層次的例外。
我在C課程中第一次遇到它,他們建議使用信號和'longjmp'作爲一種異常機制;你也可以從'SIGFPE'和'SIGINT'等東西中恢復過來。然而,後來證明C標準說它是'信號處理程序'中'longjmp'的未定義行爲。 –
setjmp
建立返回點,你可以從深使用longjmp
調用堆棧返回。它通常被認爲是不好的風格(類似於goto
)。
第一次被調用時,則返回0。然後,如果一個longjmp
發生回跳點,這將是彷彿setjmp
與1 longjmp
返回也可以發送不同的返回代碼,但如果您嘗試發送0,結果將是1
#include <setjmp.h>
jmp_buf j;
main(){
if(setjmp(j)){
printf("boo!\n");
return 0;
}
myfunc();
printf("5");
}
myfunc(){
printf("1");
myotherfunc();
}
myotherfunc(){
printf("2");
myfriendsfunc();
}
myfriendsfunc(){
printf("3");
longjmp(j, 0);
printf("4");
}
輸出:
$ ./jmp
123boo!
'setjmp'的手冊頁的哪個部分不明白? –