#include <setjmp.h>
int setjmp(jmp_buf environment);
void longjmp(jmp_buf environment, int value);
C標(biāo)準(zhǔn)庫提供了 setjmp() 宏,longjmp() 函數(shù)以及一個 jmp_buf 類型來完成異常處理的功能。
- jmp_buf 是一個數(shù)組類型恋脚,用于保存 setjmp() 和 longjmp() 里的信息腺办。
-
setjmp() 是一個宏,用于將當(dāng)前環(huán)境保存到 environment 里面糟描,供之后 longjmp() 使用怀喉。(當(dāng)前環(huán)境也就是調(diào)用該宏的位置,之后 longjmp() 使用該 environment 時船响,會從該位置返回)
該宏調(diào)用會返回多次躬拢,第一次調(diào)用該宏會立即返回躲履,且返回值為 0 。之后該宏返回時機則由 longjmp() 函數(shù)調(diào)用決定聊闯,且本次返回值為 longjmp() 里的第二個參數(shù) value 工猜。 - longjmp() 函數(shù)會恢復(fù)變量 environment 里保存的環(huán)境,該環(huán)境是最近一次 setjmp() 保存到 environment 里的環(huán)境菱蔬。參數(shù) value 就是 setjmp() 之后返回的值篷帅。
參考例程如下:來自 https://www.tutorialspoint.com/c_standard_library/c_function_longjmp.htm
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
int main () {
int val;
jmp_buf env_buffer;
/* save calling environment for longjmp */
val = setjmp( env_buffer );
if( val != 0 ) {
printf("Returned from a longjmp() with value = %s\n", val);
exit(0);
}
printf("Jump function call\n");
jmpfunction( env_buffer );
return(0);
}
void jmpfunction(jmp_buf env_buf) {
longjmp(env_buf, "tutorialspoint.com");
}
結(jié)果如下:
Jump function call
Returned from a longjmp() with value = tutorialspoint.com
《C語言接口與實現(xiàn)——創(chuàng)建可重用軟件的技術(shù)》里使用 setjmp() 和 longjmp() 實現(xiàn)了一套 Except 的異常處理機制,可以學(xué)習(xí)參考下 setjmp() 和 longjmp() 的設(shè)計使用拴泌。