C 初學習之錯誤處理 非區域性跳轉

2021-08-07 06:37:38 字數 1095 閱讀 7348

通常情況,不使用goto語句的情況下,函式會返回到他被呼叫的位置。但是使用可以使乙個函式直接跳轉到另一函式,不需要返回。

中最重要的內容是setjmp巨集和longjmp函式。—— 

setjmp巨集「標記」程式的乙個位置;longjmp函式可以跳轉到之前所標記的位置。

該強大的機制主要運用在錯誤處理之中。

(1)呼叫setjmp巨集的引數是乙個jmp_buf(在中宣告)型別的變數。setjmp巨集會將當前的 環境 儲存到該變數以便longjmp函式呼叫時使用,然後返回0。

呼叫格式: int setjmp(jmp_buf env);

(2)呼叫longjmp函式的引數是和setjmp使用同一jup_buf型別的變數(用該變數內容來恢復當前環境)然後從setjmp巨集呼叫中返回值val(longjmp函式的第二個引數)。

呼叫格式: void longjmp(jmp_buf env,int val);

總而言之,setjmp在第一次呼叫時返回0,隨後longjmp函式呼叫後將控制權重新轉給setjmp巨集,這次呼叫的

setjmp會

返回乙個非零值。

//測試setjmp的longjmp

#include

#include

jmp_buf env;

void f1(void);

void f2(void);

int main(void)

f1();

printf("program terminates normally\n");

getch();

return 0;

}void f1(void)

void f2(void)

結果如圖所示:

可知,setjmp巨集最初返回0,main會呼叫f1,接著f1呼叫f2,f2使用longjmp將控制權重新轉給main函式,

而不是返回

到f1.當longjmp函式執行時,控制權重新回到setjmp巨集呼叫,這一次setjmp巨集返回1。

c之錯誤處理

c 語言不提供對錯誤處理的直接支援,但是作為一種系統程式語言,它以返回值的形式允許您訪問底層資料。在發生錯誤時,大多數的 c 或 unix 函式呼叫返回 1 或 null,同時會設定乙個錯誤 errno,該錯誤 是全域性變數,表示在函式呼叫期間發生了錯誤。您可以在 標頭檔案中找到各種各樣的錯誤 所以...

Zend Framework學習 之錯誤處理

只在提交表單的時候出問題呢?我一步步跟蹤查詢問題的出處,最後竟然發現是在寫入資料庫的時候出了問題.對於我這個zend 新手來說,寫入資料庫的時候出現找不到控制器的問題,兩相不相干的問題,那真是難上加難,無耐之下,我把裡面擴張的類全部用教程裡的原始碼替換,看看是不是自己有些地方寫錯,沒想,替換以後還是...

Unity學習(C ) 錯誤處理(異常處理)

try catch catch finally static void main string args int num1 23 console.writeline array 5 catch nullreferenceexception e 依然報錯,因為捕捉的異常型別不對 catch index...