C 語言中函數的跳轉
1.同一個函數內,可以使用goto語句:
eg:
void text_1( void )
{
char i=0;
a :
i++;
printf ( " text_1 = %d \r\n" , i);
goto a ;
}
2.不同函數之間的跳轉,可以使用 setjmp / longjmp 函數:
eg:
jmp_buf jb;
char i=0;
void text_2 ( void )
{
setjmp(jb); // 保存當前AR到jb變量中
i++;
printf ( " text_2 = %d \r\n" , i);
}
void text_3 ( void )
{
longjmp(jb, 1); // 設置當前AR為jb,並跳轉到調用setjmp()之後的第一個語句處
}
void main ( void )
{
text_2 ( );
wheil ( 1 )
{
text_3 ( );
}
}
這裏 setjmp( ) 第一次調用時總是返回 0,並標記當前AR地址;而通過 longjmp ( jb , r ) 跳轉後其返
回值被修改為 r,並且 r 不能為 0。這樣程序可以根據 setjmp( ) 的返回值來判斷是否是 longjmp( ) 導致了
跳轉才執行到此。
C語言中每當有一個函數調用時,就會在堆棧(Stack)上準備一個被稱為AR的結構,這個方法主要是
利用了 Active Record (活動記錄)的地址實現的跳轉。
註意:函數跳轉不要亂用,容易打亂程序,一般函數跳轉可以拿來做一些異常處理機制!
C 語言中函數的跳轉