最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

setjmp與longjmp

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

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

  • 準(zhǔn)備階段:在內(nèi)核棧保存通用寄存器內(nèi)容
  • 處理階段:保存硬件出錯碼和異常類型號,然后向當(dāng)前進(jìn)程發(fā)送信號
  • 恢復(fù)階段:恢復(fù)保存在內(nèi)核棧中的各個寄存器內(nèi)容,返回當(dāng)前進(jìn)程的斷電處繼續(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) {  
  // 進(jìn)入此行前,setjmp返回0
  first(); 
 }
 // longjmp跳轉(zhuǎn)回,setjmp返回1,因此進(jìn)入此行
 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的返回值

當(dāng)然你也可以用switch代替上面的if else,其實try catch就相當(dāng)于上面的那個函數(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)

    C++詳解鏈棧的實現(xiàn)

    今天我們學(xué)習(xí)的是鏈棧,也就是說棧的鏈?zhǔn)浇Y(jié)構(gòu),我們運用順序鏈的方式來實現(xiàn)。首先呢,鏈棧是不存在存儲空間滿的情況的,所以可以說它是個無底洞,然而我們之前學(xué)的順序棧是有額定空間的
    2022-06-06
  • C語言超詳細(xì)講解隊列的實現(xiàn)及代碼

    C語言超詳細(xì)講解隊列的實現(xiàn)及代碼

    隊列(Queue)與棧一樣,是一種線性存儲結(jié)構(gòu),它具有如下特點:隊列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡稱FIFO結(jié)構(gòu)。在隊尾添加元素,在隊頭刪除元素
    2022-04-04
  • C++ LeetCode1805字符串不同整數(shù)數(shù)目

    C++ LeetCode1805字符串不同整數(shù)數(shù)目

    這篇文章主要為大家介紹了C++ LeetCode1805字符串不同整數(shù)數(shù)目,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C++類的構(gòu)造與析構(gòu)特點及作用詳解

    C++類的構(gòu)造與析構(gòu)特點及作用詳解

    本文章將會可能會涉及到匯編的知識,不過沒有關(guān)系,我會講的盡量通俗易懂;另外本篇文章開始前,建議了解下什么是函數(shù)重載,這個概念很簡單的--有相同的函數(shù)名,但參數(shù)列表不相同的函數(shù),就是函數(shù)重載
    2022-10-10
  • C++實現(xiàn)四則運算器(帶括號)

    C++實現(xiàn)四則運算器(帶括號)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)四則運算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • OpenCV實現(xiàn)最小外接正矩形

    OpenCV實現(xiàn)最小外接正矩形

    這篇文章主要為大家詳細(xì)介紹了OpenCV實現(xiàn)最小外接正矩形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++深度探索虛函數(shù)指針示例

    C++深度探索虛函數(shù)指針示例

    虛函數(shù)主要通過V-Table虛函數(shù)表來實現(xiàn),該表主要包含一個類的虛函數(shù)的地址表,可解決繼承、覆蓋的問題,下面這篇文章主要給大家介紹了如何通過一篇文章帶你掌握C++虛函數(shù)的來龍去脈,需要的朋友可以參考下
    2022-12-12
  • 概率的問題:使用遞歸與多次試驗?zāi)M的分析

    概率的問題:使用遞歸與多次試驗?zāi)M的分析

    以下對概率的問題:使用了遞歸和多次試驗?zāi)M。需要的朋友參考下
    2013-05-05
  • C語言二維數(shù)組應(yīng)用之井字棋游戲

    C語言二維數(shù)組應(yīng)用之井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言二維數(shù)組應(yīng)用之井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++11右值引用和移動語義的實例解析

    C++11右值引用和移動語義的實例解析

    左值和右值都是針對表達(dá)式,左值是指表達(dá)式結(jié)束后依然存在的持久對象,右值是指表達(dá)式結(jié)束時就不再存在的臨時對象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動語義的相關(guān)資料,需要的朋友可以參考下
    2022-09-09

最新評論

扶沟县| 吉首市| 牙克石市| 台中县| 浦北县| 道孚县| 鹤峰县| 金寨县| 正定县| 宁安市| 崇仁县| 普宁市| 迁安市| 莱西市| 舟山市| 双辽市| 长武县| 来凤县| 淮安市| 长宁县| 原平市| 南充市| 五莲县| 佳木斯市| 永和县| 浑源县| 冀州市| 巧家县| 砀山县| 甘德县| 喀喇沁旗| 寻乌县| 镇安县| 平谷区| 奇台县| 凌源市| 寻乌县| 渭源县| 永安市| 襄城县| 卓资县|