2014-04-01 97 views

回答

2

setjmp保存上下文來longjmp未來的呼叫。直接調用它時返回零(所以,這裏繼續執行jpeg_create_compress)。當稍後調用longjmp(它必須在當前函數返回之前,但它可以處於任意調用深度)時,執行將直接返回到setjmp調用,並恢復,就好像setjmp返回給longjmp的任何內容。據推測,在這種情況下,longjmp將被調用一個非零值,因此該方法將直接返回false

看看上下文,它看起來像用於錯誤處理。我認爲longjmp可以在以下compress期間被調用。把它看作低層次的例外。

+0

我在C課程中第一次遇到它,他們建議使用信號和'longjmp'作爲一種異常機制;你也可以從'SIGFPE'和'SIGINT'等東西中恢復過來。然而,後來證明C標準說它是'信號處理程序'中'longjmp'的未定義行爲。 –

3

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!