欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c語言沒有try catch的替代方案

 更新時間:2020年06月12日 11:01:11   作者:AD_milk  
這篇文章主要介紹了c語言沒有try catch的替代方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

setjmp與longjmp

后綴jmp指的就是jump,關(guān)看名字就能猜到這哥倆是干啥的了。使用他們倆就可以讓程序控制流轉(zhuǎn)移,進而實現(xiàn)對異常的處理。

異常處理的結(jié)構(gòu)可以劃分為以下三個階段:

  • 準備階段:在內(nèi)核棧保存通用寄存器內(nèi)容
  • 處理階段:保存硬件出錯碼和異常類型號,然后向當前進程發(fā)送信號
  • 恢復階段:恢復保存在內(nèi)核棧中的各個寄存器內(nèi)容,返回當前進程的斷電處繼續(xù)執(zhí)行

過程有點類似遞歸,只有文字你可能看的有點云里霧里,我們結(jié)合一個小例子來看看

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
 printf("second\n"); 
 // 跳回setjmp的調(diào)用處 - 使得setjmp返回值為1  
 longjmp(buf, 1);    
}

void first(void) {
 second();
 //這行到不了,因為second里面longjmp已經(jīng)跳轉(zhuǎn)回去了
 printf("first\n");   
}

int main() {
 int rc;
 rc = setjmp(buf);
 if (rc==0) {  
  // 進入此行前,setjmp返回0
  first(); 
 }
 // longjmp跳轉(zhuǎn)回,setjmp返回1,因此進入此行
 else if(rc==1){     
  printf("main\n");  
 }

 return 0;
}
/*
the ressult as:
 second
 main
*/

現(xiàn)在我們再來看看兩個函數(shù)的聲明:

  • setjmp(env) :將程序上下文存儲在env中
  • longjmp(env,status):env指代setjmp中所保存的函數(shù)執(zhí)行狀態(tài)變量,status則是作為setjmp的返回值

當然你也可以用switch代替上面的if else,其實try catch就相當于上面的那個函數(shù)你可以參考這個實現(xiàn)try catch

signal信號處理

個人覺得這個在linux下更好用,并且也提供了更多的信號量宏。

下面給出的是signal頭文件中的定義

#define SIGINT   2 // interrupt
#define SIGILL   4 // illegal instruction - invalid function image
#define SIGFPE   8 // floating point exception
#define SIGSEGV   11 // segment violation
#define SIGTERM   15 // Software termination signal from kill
#define SIGBREAK  21 // Ctrl-Break sequence
#define SIGABRT   22 // abnormal termination triggered by abort call

這里僅給出維基上的例子

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void catch_function(int signal) {
 puts("Interactive attention signal caught.");
}

int main(void) {
 if (signal(SIGINT, catch_function) == SIG_ERR) {
  fputs("An error occurred while setting a signal handler.\n", stderr);
  return EXIT_FAILURE;
 }
 puts("Raising the interactive attention signal.");
 if (raise(SIGINT) != 0) {
  fputs("Error raising the signal.\n", stderr);
  return EXIT_FAILURE;
 }
 puts("Exiting.");
 return 0;
}

總結(jié)

到此這篇關(guān)于c語言沒有try catch的替代方案的文章就介紹到這了,更多相關(guān)c語言try catch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++學習貝葉斯分類器實現(xiàn)手寫數(shù)字識別示例解析

    C++學習貝葉斯分類器實現(xiàn)手寫數(shù)字識別示例解析

    這篇文章主要介紹了在C++學習中如何采用貝葉斯分類器來實現(xiàn)手寫數(shù)字識別的示例及解析有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • C語言實現(xiàn)大學生考勤管理系統(tǒng)

    C語言實現(xiàn)大學生考勤管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)大學生考勤管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言實現(xiàn)貪吃蛇小游戲開發(fā)

    C語言實現(xiàn)貪吃蛇小游戲開發(fā)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇小游戲開發(fā),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++可擴展性與多線程超詳細精講

    C++可擴展性與多線程超詳細精講

    這篇文章主要介紹了C++可擴展性與多線程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法示例

    C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法示例

    這篇文章主要介紹了C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法,涉及C++針對日期時間的數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • C語言程序如何求學生總成績和平均成績

    C語言程序如何求學生總成績和平均成績

    這篇文章主要介紹了C語言程序如何求學生總成績和平均成績,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 五個嵌入式C語言中的實用技巧分享

    五個嵌入式C語言中的實用技巧分享

    這篇文章主要和大家分享一下五個嵌入式C語言中的實用技巧,文中的示例代碼講解詳細,對我們學習C語言有一定的幫助,需要的可以參考一下
    2022-12-12
  • c++智能指針unique_ptr的使用

    c++智能指針unique_ptr的使用

    本文主要介紹了c++智能指針unique_ptr的使用,與shared_ptr作用類似,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言中循環(huán)嵌套的應用方式

    C語言中循環(huán)嵌套的應用方式

    這篇文章主要介紹了C語言中循環(huán)嵌套的應用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++超詳細講解引用和指針

    C++超詳細講解引用和指針

    引用是C++一個很重要的特性,顧名思義是某一個變量或?qū)ο蟮膭e名,對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r,這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識點,需要的朋友可以參考下
    2022-06-06

最新評論